如何解决事件被调用后停止等待 (Task.Delay(-1))
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
}
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。