与此答案相关,
如果我真的想要"Fire and Forget"一个确实返回任务的方法,并且(为简单起见)让我们假设该方法不会抛出任何异常.我可以使用答案中列出的扩展方法:
public static void Forget(this Task task)
{
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,如果存在错误,则会Task引发异常,然后抛出意外异常时,异常将被吞下并被忽视.
问题:在这种情况下,扩展方法的形式是否更合适:
public static async void Forget(this Task task)
{
await task;
}
Run Code Online (Sandbox Code Playgroud)
因此编程错误会引发异常并升级(通常会导致进程失效).
在具有预期(和可忽略的)异常的方法的情况下,该方法需要变得更加精细(除此之外,关于如何构建此方法的版本的任何建议将采用可接受和可忽略的异常类型的列表? )
在过去的几个月里,我一直在阅读C#中的async-await以及如何正确使用它.
出于实验练习的目的,我正在构建一个小型Tcp服务器,该服务器应该为连接它的客户端提供服务.该程序是一个控制台应用程序.
我使用while循环来等待连接,如下所示:
while (!_isStopRequested)
{
TcpClient client = await _tcpListener.AcceptTcpClientAsync();
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
}
Run Code Online (Sandbox Code Playgroud)
所以,到目前为止,我所做的ProcessClientAsync方法被标记为async void,我只是将其称为ProcessClientAsync(客户端),并且调用将立即返回给调用者.但是我在网上看到,除非是为了一个活动,否则使用它是一个糟糕的决定.所以我将定义更改为异步任务.
好的,但没有等待,我在Visual Studio中收到警告"因为没有等待此调用,当前方法在调用完成之前继续运行".
一旦我使用了等待ProcessClientAsync(客户端),代码就不起作用了.我只能连接一个客户端,然后调用者"等待"ProcessClientAsync返回.但是,该方法具有无限循环并且不会返回,但我需要while循环来继续处理下一个客户端.
谷歌搜索我来到这个线程: 如何在没有等待的情况下安全地调用C#中的异步方法
我想问题几乎是一样的,除了当我使用await ProcessClientAsync时,我希望它立即返回到调用者,它不会这样做,我知道因为运行第二个客户端,而第一个客户端仍在运行,第二个客户端没有连接.
所以我这样做了:
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
Run Code Online (Sandbox Code Playgroud)
但是由于ProcessClientAsync必须返回一个Task,我不确定这是否可以.
那将是一个问题.
另一个是:我怎么能调用一个永远运行的异步Task方法,让调用立即返回调用者,这样while循环可以继续,tcp监听器可以继续接受下一个客户端?
谢谢.
对不起,如果是重复,或不清楚我在问什么.