我想等待Task <T>完成一些特殊规则:如果在X毫秒后它还没有完成,我想向用户显示一条消息.如果它在Y毫秒后没有完成,我想自动请求取消.
我可以使用Task.ContinueWith异步等待任务完成(即安排在任务完成时执行的操作),但这不允许指定超时.我可以使用Task.Wait同步等待任务完成超时,但这会阻止我的线程.如何异步等待任务完成超时?
鉴于取消令牌,我想创建一个等待它的任务,这是永远不会完成但可以取消.我需要这样的模式,IMO应该很常见:
async Task DoStuff(Task t, CancellationToken ct)
{
// t was made from TaskCompletionSource,
// both t and ct are beyond my control
Task t2 = TaskFromCancellationToken(ct);
await Task.WhenAny(t, t2);
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我到目前为止最好的想法是:
Task TaskFromCancelationToken(CancellationToken ct)
{
return Task.Delay(Timeout.Infinite, ct);
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来实现这种逻辑?
我有这个代码处理的Web请求;
Response = await Client.SendAsync(Message, HttpCompletionOption.ResponseHeadersRead, CToken);
Run Code Online (Sandbox Code Playgroud)
在读取响应头之后和内容完成读取之前返回.当我打电话给这一行来获取内容时......
return await Response.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)
我希望能在X秒后停止它.但它不接受取消令牌.
我的应用程序当前使用一些命令执行 Adobe Illustrator。当结果文件出现在某个确切的文件夹中(具有异步功能)时等待,并在文件准备好时对文件执行某些操作。
但问题是,有时 Adobe Illustrator 会失败并且应用程序一直等待。在这种情况下,我不知道如何应用超时机制来终止 Adobe Illustrator 并跳过当前进程。
这是代码:
...
await WhenFileCreated(result_file_name);
if (File.Exists(result_file_name))
{
...
public static Task WhenFileCreated(string path)
{
if (File.Exists(path))
return Task.FromResult(true);
var tcs = new TaskCompletionSource<bool>();
FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(path));
FileSystemEventHandler createdHandler = null;
RenamedEventHandler renamedHandler = null;
createdHandler = (s, e) =>
{
if (e.Name == Path.GetFileName(path))
{
tcs.TrySetResult(true);
watcher.Created -= createdHandler;
watcher.Dispose();
}
};
renamedHandler = (s, e) =>
{
if (e.Name == Path.GetFileName(path))
{
tcs.TrySetResult(true);
watcher.Renamed -= renamedHandler;
watcher.Dispose(); …Run Code Online (Sandbox Code Playgroud)