0

以下のC#3.0で動作するコードがある場合、行を置き換えてC#4.0に変換するにはどうすればよいですか?

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

Task task1 = Task.Factory.StartNew(//?

動作する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();
       }
    );
  }
}

出力の生成:

Press enter to continue:
From method LongGetOrAdd()!

dict.Key = 1  dict.Value = 1
4

2 に答える 2

2

これで十分です。

    var c = LongGetOrAdd(dict, 1);

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

    Task.WaitAll(task);
    Console.ReadLine();
于 2013-03-14T15:09:36.677 に答える
0

戻るデリゲートのタイプを変更してLongGetOrAdd、他のメソッドを呼び出す必要があります。

また、実際には情報を渡していないため、ラムダからパラメーターを削除する必要があります。

のシグニチャを見るだけで、これらすべてがコンパイラ/インテリセンスによって明確に示されますTask.Factory.StartNew

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();
}
于 2013-03-14T15:13:45.247 に答える