【发布时间】:2015-08-22 05:17:18
【问题描述】:
在过去的几个月里,我一直在阅读 C# 中的 async-await 以及如何正确使用它。
出于实验室练习的目的,我正在构建一个小型 Tcp 服务器,它应该为连接到它的客户端提供服务。该程序是一个控制台应用程序。
我使用 while 循环来等待这样的连接:
while (!_isStopRequested)
{
TcpClient client = await _tcpListener.AcceptTcpClientAsync();
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
}
所以,到目前为止,我创建的方法 ProcessClientAsync 被标记为 async void,我只需将其称为 ProcessClientAsync(client),该调用将立即返回给调用者。 但是,我在互联网上读到,除非用于活动,否则使用它是一个糟糕的决定。 所以我将定义更改为异步任务。
好的,但没有等待,我在 Visual Studio 中收到警告“因为未等待此调用,当前方法在调用完成之前继续运行”。
一旦我使用了 await ProcessClientAsync(client),代码就不起作用了。我只能连接一个客户端,然后调用者“等待” ProcessClientAsync 返回。但是,那个方法有一个无限循环并且不会返回,但是我需要while循环来继续处理下一个客户端。
谷歌搜索我想出了这个线程: How to safely call an async method in C# without await
我想问题几乎相同,除了当我使用 await ProcessClientAsync 时,我希望它立即返回给调用者,但它不会这样做,我知道因为运行第二个客户端,而第一个是仍在运行,第二个客户端未连接。
所以我这样做了:
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
但是由于 ProcessClientAsync 必须返回一个任务,我不确定这样做是否可以?
这是一个问题。
另一个是:我如何调用一个将永远运行的异步任务方法,并让调用立即返回给调用者,以便 while 循环可以继续并且 tcp 侦听器可以继续接受下一个客户端?
谢谢。
抱歉,如果是重复,或者不清楚我在问什么。
【问题讨论】:
-
请缩小您的问题范围:它过于宽泛。另外,为了更好的可读性,请进行一些编辑,不包括非必要部分。谢谢和问候,
标签: c# .net multithreading asynchronous async-await