C# 如何用Task.Factory.StartNew()替换ThreadPool.QueueUserWorkItem()?

C# 如何用Task.Factory.StartNew()替换ThreadPool.QueueUserWorkItem()?,c#,multithreading,linq,lambda,task-parallel-library,C#,Multithreading,Linq,Lambda,Task Parallel Library,在C#3.0中有下面的工作代码,如何在替换了该行之后将其转换为C#4.0 ThreadPool.QueueUserWorkItem(LongGetOrAdd(dict, 1)); 借 ? C#3.0控制台应用程序的完整工作代码: using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; class Program { static void Main() {

在C#3.0中有下面的工作代码,如何在替换了该行之后将其转换为C#4.0

ThreadPool.QueueUserWorkItem(LongGetOrAdd(dict, 1));

?

C#3.0控制台应用程序的完整工作代码:

using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
class Program
{
  static void Main()
  {
    var dict = new ConcurrentDictionary<int, string>();
    ThreadPool.QueueUserWorkItem(LongGetOrAdd(dict, 1));

//???????
//Task task1 = Task.Factory.StartNew((Action)(LongGetOrAdd(dict, 1));

    Console.WriteLine("Press enter to continue:");
    foreach (var a in dict)
    Console.WriteLine("dict.Key = {0}  dict.Value = {1}  ", a.Key, a.Value);


    Console.ReadLine();
  }
  private static WaitCallback LongGetOrAdd(ConcurrentDictionary<int, string> dict, int index)
  {
    return o => dict.GetOrAdd
    (index, 
     i =>
       {
         Console.WriteLine("From method LongGetOrAdd()!");
         Thread.SpinWait(1000);
         return i.ToString();
       }
    );
  }
}
这应该可以

    var c = LongGetOrAdd(dict, 1);

    var t = Task.Factory.StartNew(() => c.Invoke(null));

    Task.WaitAll(task);
    Console.ReadLine();

您只需要更改
LongGetOrAdd
返回的委托类型并调用另一个方法

您还需要从lambda中删除该参数,因为您实际上没有传递任何信息

只要查看
Task.Factory.StartNew
的签名,编译器/intellisense就会清楚地指出所有这些

private static Action LongGetOrAdd(ConcurrentDictionary<int, string> dict, int index)
{
    return () => dict.GetOrAdd
    (index,
     i =>
     {
         Console.WriteLine("======!");
         Thread.SpinWait(1000);
         return i.ToString();
     }
    );
}
private static void Main()
{
    var dict = new ConcurrentDictionary<int, string>();
    Task.Factory.StartNew(LongGetOrAdd(dict, 1));

    Console.WriteLine();
    Console.WriteLine("press any key to exit . . .");
    Console.ReadKey();
}
私有静态操作LongGetOrAdd(ConcurrentDictionary dict,int-index)
{
return()=>dict.GetOrAdd
(索引,
i=>
{
Console.WriteLine(“==========!”);
Thread.SpinWait(1000);
返回i.ToString();
}
);
}
私有静态void Main()
{
var dict=新的ConcurrentDictionary();
Task.Factory.StartNew(LongGetOrAdd(dict,1));
Console.WriteLine();
Console.WriteLine(“按任意键退出…”);
Console.ReadKey();
}

查看代码
LongGetOrAdd
创建一个委托,但它不执行该工作。实际上,它不应该执行该委托,因为它是委托。我编辑了。。因此,编辑的版本应该可以工作,但是..@Servy,该方法将值
“===!”
输出到控制台,并用
键==1
值==”===!“
填充字典。其目的不是更改功能,而是通过
Task.Factory.StartNew()
equivalently@Fulproof如果你想评论我的答案,你应该真正评论我的答案,而不是评论别人的答案或编辑问题的答案。接下来,我的代码根本不改变任何功能,它保持与您的代码相同的功能,与此答案不同,此答案实际上通过添加
Task.WaitAll
来更改功能。在正确写入后,Intellisense会指示此答案,否则Intellisense会给出签名+15overloads@Fulproof如果只更改方法名,则会看到一个语法错误,指示委托类型不正确;您只需将委托更改为匹配的委托即可。至于重载,只需从参数最少的重载开始,并根据需要向上移动即可。在本例中,您需要两个单参数重载之一。如果你特别困惑或好奇,谷歌总是会提供数以百万计的例子。Servy,谢谢,但目的不是以任何方式改变方法或任何功能。这个问题没有问this@Fulproof这个答案不会以任何方式改变任何功能;它产生了相同的功能,但通过使用TPL类而不是
System.Threading
类,这正是您所要求的。@Fulproof它到底改变了什么?
    var c = LongGetOrAdd(dict, 1);

    var t = Task.Factory.StartNew(() => c.Invoke(null));

    Task.WaitAll(task);
    Console.ReadLine();
private static Action LongGetOrAdd(ConcurrentDictionary<int, string> dict, int index)
{
    return () => dict.GetOrAdd
    (index,
     i =>
     {
         Console.WriteLine("======!");
         Thread.SpinWait(1000);
         return i.ToString();
     }
    );
}
private static void Main()
{
    var dict = new ConcurrentDictionary<int, string>();
    Task.Factory.StartNew(LongGetOrAdd(dict, 1));

    Console.WriteLine();
    Console.WriteLine("press any key to exit . . .");
    Console.ReadKey();
}