4
我試圖實現自定義awaiteable執行await Thread.SleepAsync()
沒有創建任何額外的線程。如何在c#中創建和使用自定義Awaitable?
下面是我得到了什麼:
class AwaitableThread : INotifyCompletion
{
public AwaitableThread(long milliseconds)
{
var timer = new Timer(obj => { IsCompleted = true; }, null, milliseconds, Timeout.Infinite);
}
private bool isCompleted = false;
public bool IsCompleted
{
get { return isCompleted; }
set { isCompleted = value; }
}
public void GetResult()
{}
public AwaitableThread GetAwaiter() { return this; }
public void OnCompleted(Action continuation)
{
if (continuation != null)
{
continuation();
}
}
}
而這裏的睡眠將如何工作:
static async Task Sleep(int milliseconds)
{
await new AwaitableThread(milliseconds);
}
的問題是,這個函數返回immidiatly,即使在OnCompleted
,IsCompleted
仍假。
我在做什麼錯?
爲什麼不使用我在上一個問題上給出的答案? Task.Delay'正是你想要的。 (它立即完成的原因是順便說明你的OnCompleted方法做錯了什麼。) –
我已經將它標記爲正確的答案,但現在我仍然對這些東西是如何工作並且可以是好奇的擴展 –
如果你想了解'async'內部,最好的資源是[Jon Skeet的eduasync系列](http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx)。 –