Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程,任务运行错误';以下方法或属性之间的调用不明确';_C#_Multithreading_Task_Ambiguous - Fatal编程技术网

C# 多线程,任务运行错误';以下方法或属性之间的调用不明确';

C# 多线程,任务运行错误';以下方法或属性之间的调用不明确';,c#,multithreading,task,ambiguous,C#,Multithreading,Task,Ambiguous,当我尝试构建项目时,将显示以下错误消息 以下方法或属性之间的调用不明确: 'System.Threading.Tasks.Task.Run(System.Action)'和 'System.Threading.Tasks.Task.Run(System.Func)' 我怎样才能解决这个问题 public static class MaintananceManager { private static ThreadSafeSocialMediaList<Post>

当我尝试构建项目时,将显示以下错误消息

以下方法或属性之间的调用不明确: '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);

            }

        }

    }
公共静态类维护管理器
{
private static ThreadSafeSocialMediaList PostList=新的ThreadSafeSocialMediaList();
private static ThreadSafeSocialMediaList SocialUserList=新的ThreadSafeSocialMediaList();
私有静态列表提供程序=新列表();
私有常量int CACHESIZE=1000;
静态维护管理器()
{
添加(新的SqlServerProvider());
任务运行(开始维护);
}
公共静态职位(IEnumerable职位)
{
PostList.AddRange(posts);
}
公共静态用户(IEnumerable用户)
{
SocialUserList.AddRange(用户);
}
公共静态SocialUser GetSocialUser(SocialMediaType,字符串socialMediaId)
{
foreach(提供程序中的var提供程序)
{
尝试
{
返回provider.GetSocialUser(mediaType,socialMediaId);
}
抓住
{
}
}
返回null;
}
private static void posts()
{
var liste=PostList.Flush();
foreach(提供程序中的var提供程序)
{
provider.SavePosts(liste);
}
}
私有静态用户()
{
var liste=SocialUserList.Flush();
foreach(提供程序中的var提供程序)
{
provider.SaveSocialUsers(列表);
}
}
私有静态无效开始维护()
{
while(true)
{
如果(PostList.Count>CACHESIZE)
坚持岗位();
如果(SocialUserList.Count>CACHESIZE)
持久化用户();
睡眠(60000);
}
}
}

有几种方法可以将此作为有效的
操作传递:

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

Task.Run((Action)startMaintaining);

Task.Run(new Action(startMaintaining));

如果您使用的是.Net 4.5+,我想您是这样做的,您可以通过将其签名从
private static void startmaining()
更改为
private static Task startmaining()
并替换
thread.Sleep(60000),避免占用执行维护例程的线程池线程,从而获得更好的总体性能通过
等待任务。延迟(60000)。配置等待(false)以充分利用TPL。您还需要它是异步的,以便能够使用WAIT