Multi Threading, Task.Run Error 'Извикването е двусмислено между следните методи или свойства'

Когато се опитам да създам проект, се показва следното съобщение за грешка.

Извикването е двусмислено между следните методи или свойства: „System.Threading.Tasks.Task.Run(System.Action)“ и „System.Threading.Tasks.Task.Run(System.Func)“

Как мога да поправя това?

public static class MaintananceManager
    {
        private static ThreadSafeSocialMediaList<Post> PostList = new ThreadSafeSocialMediaList<Post>();
        private static ThreadSafeSocialMediaList<SocialUser> SocialUserList = new ThreadSafeSocialMediaList<SocialUser>();

        private static List<IPersistentProvider> providers = new List<IPersistentProvider>();
        private const int CACHESIZE = 1000;

        static MaintananceManager()
        {
            providers.Add(new SqlServerProvider());
            Task.Run(startMaintaining);

        }
        public static void PersistPosts(IEnumerable<Post> posts) 
        {
            PostList.AddRange(posts);
        }
        public static void PersistSocialUsers(IEnumerable<SocialUser> users)
        {
            SocialUserList.AddRange(users);
        }

        public static SocialUser GetSocialUser(SocialMediaType mediaType,string socialMediaId)
        {
            foreach(var provider in providers)
            {
                try
                {
                    return provider.GetSocialUser(mediaType, socialMediaId);
                }
                catch
                {

                }

            }
            return null;
        }
        private static void persistPosts()
        {
            var liste = PostList.Flush();
            foreach(var provider in providers)
            {
                provider.SavePosts(liste);
            }
        }
        private static void persistUsers()
        {
            var liste = SocialUserList.Flush();
            foreach (var provider in providers)
            {
                provider.SaveSocialUsers(liste);
            }
        }
        private static void startMaintaining()
        {
            while(true)
            {
                if (PostList.Count > CACHESIZE)
                    persistPosts();
                if (SocialUserList.Count > CACHESIZE)
                    persistUsers();

                Thread.Sleep(60000);

            }

        }

    }

person Emre BEGEN    schedule 25.02.2015    source източник
comment
Ако сте в .Net 4.5+, което според мен правите, бихте могли да избегнете преместването на нишката на пула от нишки, която изпълнява рутинната поддръжка, и да получите по-добра цялостна производителност, като промените нейния подпис от private static void startMaintaining() на private static Task startMaintaining() и замените Thread.Sleep(60000); с await Task.Delay(60000).ConfigureAwait(false);, за да се възползвате напълно на ТЗЛ.   -  person gfache    schedule 24.01.2018
comment
също трябва да е асинхронен, за да можете да използвате await   -  person Matus    schedule 03.03.2021


Отговори (1)


Има няколко начина, по които можете да предадете това като валиден Action:

Task.Run(() => startMaintaining());

Task.Run((Action)startMaintaining);

Task.Run(new Action(startMaintaining));
person Grant Winney    schedule 25.02.2015