1

メソッドを非同期的に開始するこの単純なコードがあります。コードを Task でラップTCSするために使用します。

Task<int> DoWork()
{
    var source = new TaskCompletionSource <int>();
    Thread.Sleep(220);
    source.SetResult(9999999);
    return source.Task;
}

void Main()
{
    Console.WriteLine(1);

    var t1=Task.Factory.StartNew(()=>DoWork());
    t1.ContinueWith(_=>Console.WriteLine ("doing something different "));
    t1.ContinueWith(_=>Console.WriteLine ("finished , value is ="+_.Result.Result));

    Console.WriteLine(2);
    Console.ReadLine();
}

出力:

1
2
doing somethign different  //those last 2 lines can be swapped
finished , value is =9999999

しかし今、私はそれを変換して使用したいと考えていますTask.FromResult<TResult>

これは十分に文書化 されていないので、どうすれば上記のコードを変換してTask.FroResult代わりに使用できるのでしょうか?

4

2 に答える 2

1

コードでは、同期待機が終了した後にのみを返すTaskため、コードは次と同等です。

Task<int> DoWork()
{
    Thread.Sleep(220);
    return Task.FromResult(9999999);
}

ただし、Taskすぐに返してから他のスレッドをブロックした場合:

Task<int> DoWork()
{
    var source = new TaskCompletionSource<int>();
    Task.Run(() =>
    {
        Thread.Sleep(220);
        source.SetResult(9999999);
    });
    return source.Task;
}

(注: これを実際のコードで行うべきだと言っているわけではありません。)

このコードは、 によってシミュレートできませんでした。これTask.FromResult()は、常に完了済みの を作成するためTaskです。

于 2013-06-27T12:53:01.570 に答える