我有這個簡單的代碼異步啓動一個方法。它使用TCS
以包裝與任務的代碼。將TaskCompletionSource轉換爲Task.FromResult <TResult>?
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>
。
這是poorly documented,所以我想知道,如何將上面的代碼轉換爲使用Task.FroResult
代替?
其實它不像我的例子。由於睡眠,Myne在某處有一個被阻塞的線程,而你的任務並沒有完成。延遲使用不阻塞的計時器 –
@RoyiNamir足夠正確,它是異步等待,不會阻塞等待,但由於您現在正在使用異步和等待,因此tumb的一般規則是您不應該等待同步。除非你想花時間解決死鎖:) –
@PatrykĆwiek是的,但這並不意味着你應該說這是行爲*完全相同。 – svick