C# Task.Delay 阻止第二个任务
C# Task.Delay blocks second task
我要运行两个任务。
StartAccessTokenTimer()
运行s 每 60 秒刷新一次 accesstoken 变量。
StartItemsTimer()
将在 StartAccessTokenTimer()
之后开始,如果获得访问令牌,则每 3 秒工作一次。
private accessToken = "";
private async Task StartAccessTokenTimer()
{
CancellationTokenSource source = new CancellationTokenSource();
while (true)
{
accesstoken = await GetAccessToken();
await Task.Delay(TimeSpan.FromSeconds(3), source.Token);
}
}
private async Task StartItemsTimer()
{
CancellationTokenSource source = new CancellationTokenSource();
while (true)
{
var items = await GetItems(accessToken, "1");
await Task.Delay(TimeSpan.FromSeconds(60), source.Token);
}
}
public async Task StartOperations(){
await StartAccessTokenTimer();
await StartItemsTimer();
}
但它不符合 GetItems()
方法。因为 StartAccessTokenTimer()
永远不会启动。它会连续触发 GetAccessToken()
。
要同时触发它们,您可以执行以下操作:
public async Task StartOperations()
{
await Task.WhenAll(new Task[]
{
StartAccessTokenTimer(),
StartItemsTimer()
});
}
我要运行两个任务。
StartAccessTokenTimer()
运行s 每 60 秒刷新一次 accesstoken 变量。
StartItemsTimer()
将在 StartAccessTokenTimer()
之后开始,如果获得访问令牌,则每 3 秒工作一次。
private accessToken = "";
private async Task StartAccessTokenTimer()
{
CancellationTokenSource source = new CancellationTokenSource();
while (true)
{
accesstoken = await GetAccessToken();
await Task.Delay(TimeSpan.FromSeconds(3), source.Token);
}
}
private async Task StartItemsTimer()
{
CancellationTokenSource source = new CancellationTokenSource();
while (true)
{
var items = await GetItems(accessToken, "1");
await Task.Delay(TimeSpan.FromSeconds(60), source.Token);
}
}
public async Task StartOperations(){
await StartAccessTokenTimer();
await StartItemsTimer();
}
但它不符合 GetItems()
方法。因为 StartAccessTokenTimer()
永远不会启动。它会连续触发 GetAccessToken()
。
要同时触发它们,您可以执行以下操作:
public async Task StartOperations()
{
await Task.WhenAll(new Task[]
{
StartAccessTokenTimer(),
StartItemsTimer()
});
}