C# 多线程,任务运行错误';以下方法或属性之间的调用不明确';
当我尝试构建项目时,将显示以下错误消息 以下方法或属性之间的调用不明确: 'System.Threading.Tasks.Task.Run(System.Action)'和 'System.Threading.Tasks.Task.Run(System.Func)' 我怎样才能解决这个问题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>
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