调用事件后停止等待 (Task.Delay(-1))
Stop waiting (Task.Delay(-1)) after event was invoked
我有这样的代码
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
必须 end/perform return 而不是等待?
是否有一种“不错”的方式来做到这一点,或者我必须做一些工作,比如抛出异常并在“上方”捕获它?
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 并对其调用取消,这将启动对令牌的取消调用。
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
public async Task DoStuff()
{
_client.Ready += () => client_Ready("test");
await Task.Delay(-1, cancelTokenSource.Token);
// do something else here if desired
}
private async Task client_Ready(string message)
{
await _client.SendMessageAsync(message);
cancelTokenSource.Cancel();
}
您应该能够通过取消令牌完成此操作。
代码未经测试,我已经延迟完成,并使用取消重置,但从未使用无限计时器和取消。
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
}
});
}
我有这样的代码
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
必须 end/perform return 而不是等待?
是否有一种“不错”的方式来做到这一点,或者我必须做一些工作,比如抛出异常并在“上方”捕获它?
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 并对其调用取消,这将启动对令牌的取消调用。
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
public async Task DoStuff()
{
_client.Ready += () => client_Ready("test");
await Task.Delay(-1, cancelTokenSource.Token);
// do something else here if desired
}
private async Task client_Ready(string message)
{
await _client.SendMessageAsync(message);
cancelTokenSource.Cancel();
}
您应该能够通过取消令牌完成此操作。
代码未经测试,我已经延迟完成,并使用取消重置,但从未使用无限计时器和取消。
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
}
});
}