Многопоточность, ошибка Task.Run «Вызов неоднозначен для следующих методов или свойств»

Когда я пытаюсь создать проект, отображается следующее сообщение об ошибке.

Вызов неоднозначен для следующих методов или свойств: 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
также вам нужно, чтобы он был асинхронным, чтобы иметь возможность использовать ожидание   -  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