gpt4 book ai didi

c# - 等待 TaskEx.Delay

转载 作者:行者123 更新时间:2023-11-30 14:40:07 25 4
gpt4 key购买 nike

我在玩 HttpListener 和 Async CTP

class HttpServer : IDisposable
{
HttpListener listener;
CancellationTokenSource cts;

public void Start()
{
listener = new HttpListener();
listener.Prefixes.Add("http://+:1288/test/");
listener.Start();

cts = new CancellationTokenSource();

Listen();
}

public void Stop()
{
cts.Cancel();
}

int counter = 0;

private async void Listen()
{
while (!cts.IsCancellationRequested)
{
HttpListenerContext context = await listener.GetContextAsyncTask(); // my extension method with TaskCompletionSource and BeginGetContext
Console.WriteLine("Client connected " + ++counter);

// simulate long network i/o
await TaskEx.Delay(5000, cts.Token);

Console.WriteLine("Response " + counter);
// send response
}

listener.Close();
}
}

当 3 个客户端同时连接时,我希望得到以下输出

Client connected 1
Client connected 2
Client connected 3
<5000ms pause>
Response 1
Response 2
Response 3

相反我得到

Client connected 1
<5000ms pause>
Response 1
Client connected 2
<5000ms pause>
Response 2
Client connected 3
<5000ms pause>
Response 3

如果我使用延续,它会像我预期的那样工作

int c = counter;
TaskEx.Delay(5000, cts.Token).ContinueWith(t => {
Console.WriteLine("Response " + c);
// send response
});

我的印象是 await TaskEx.Delay 立即返回(并将转到 while (!cts.IsCancellationRequested)),而 while block 的其余部分将是 5000 毫秒后的延续。所以它应该和我的代码一样 .ContinueWith,不是吗?

最佳答案

TaskEx.Delay 将立即返回一个任务,但在您再次调用 listener.GetContextAsyncTask() 之前,您正在等待该任务。 caller (Start) 将在您点击第一个尚未完成但 Listen 方法,它具有同步代码的外观 - 这就是 await

这不是在继续触发时发生的词法上的“ block 的剩余部分”——它是“方法执行的剩余部分”。换句话说,该方法在 await 处有效地“暂停”,但允许调用者 继续。

关于c# - 等待 TaskEx.Delay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com