异步超时:当我有Awaiter而不是Task

时间:2018-03-28 02:38:46

标签: c# unity3d asynchronous async-await

我对异步C#有些新意,我正在处理一个Awaiter但没有Task的类。 (这是Unity 3D的WWW课程,我正在使用these extension classes来提供WWW.GetAwaiter()。)

我想对await施加超时,之后我会继续使用函数的逻辑,采用不同的代码路径,因为我知道awaiter花了太长时间。直观的解决方案是:

Task timeout = Task.Delay(20*1000);
await Task.WhenAny(wwwTask, timeout);
bool timedOut = !wwwTask.IsCompleted;

由于WWW是一个自定义类(使用GetAwaiter())而不是任务,我需要为此创建一个任务。是否正确使用辅助函数来获取该对象的任务?

private async Task<WWW> SendRequestAsync(WWW www)
{
    return await www;
}

要完成任务:

Task wwwTask = SendRequestAsync(www);

这个超时逻辑是否合理,当只有awaiter时,它是使用Tasks的最简单方法吗?

1 个答案:

答案 0 :(得分:1)

要返回使用泛型更改代码的任务:

private async Task<WWW> SendRequestAsync(WWW www)
{
    return await www;
}

private async Task<WWW> SendRequestAsync(WWW www)
{
    return Task.FromResult(www);
}