问题描述
public async Task DoStuff()
{
_client.Ready += () => client_Ready("test");
await Task.Delay(-1);
}
private async Task client_Ready(string message)
{
await _client.SendMessageAsync(message);
}
如何说在调用 client_Ready
之后,一旦整个 DoStuff
必须结束/执行返回而不是等待?
是否有一种“不错”的方法来做,或者我必须做一些工作,例如抛出异常并在“上方”捕获它?
MRE:
using System;
using System.Threading.Tasks;
public class Program
{
public static async Task RandomlyDelayedStuff()
{
Console.WriteLine("this ended");
await Task.Delay(200);
}
public static async Task DoStuff()
{
var rnd = new Random();
await Task.Delay(rnd.Next(0,5000)).ContinueWith(async task =>
{
await RandomlyDelayedStuff();
});
await Task.Delay(-1);
}
public static async Task Main()
{
await DoStuff();
Console.WriteLine("ended");
}
}
解决方法
使用取消令牌。将令牌传递给延迟调用。您可以创建一个 CancellationTokenSource 并对其调用取消,这将启动对令牌的取消调用。
can only be called from completion function
,
您应该能够通过取消令牌完成此操作。
代码未经测试,我延迟完成,并使用取消重置,但从未使用无限计时器和取消。
const int cDelayMS = -1;
private System.Threading.CancellationTokenSource mCancel = new();
DoStuff()
{
Task.Delay(cDelayMS,mCancel.Token).ContinueWith(
async antecedent =>
{
if (antecedent.Status == TaskStatus.Canceled)
{
// do whatever here
}
});
}