相关疑难解决方法(0)

异步等待Task <T>以超时完成

我想等待Task <T>完成一些特殊规则:如果在X毫秒后它还没有完成,我想向用户显示一条消息.如果它在Y毫秒后没有完成,我想自动请求取消.

我可以使用Task.ContinueWith异步等待任务完成(即安排在任务完成时执行的操作),但这不允许指定超时.我可以使用Task.Wait同步等待任务完成超时,但这会阻止我的线程.如何异步等待任务完成超时?

.net c# task-parallel-library

350
推荐指数
13
解决办法
20万
查看次数

取消令牌的任务?

鉴于取消令牌,我想创建一个等待它的任务,这是永远不会完成但可以取消.我需要这样的模式,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)

是否有更好的方法来实现这种逻辑?

.net c# multithreading task-parallel-library async-await

16
推荐指数
2
解决办法
4921
查看次数

如何为不接受取消令牌的异步功能设置超时?

我有这个代码处理的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秒后停止它.但它不接受取消令牌.

.net c# asynchronous httpclient task-parallel-library

7
推荐指数
1
解决办法
6591
查看次数

异步任务超时

我的应用程序当前使用一些命令执行 Adob​​e Illustrator。当结果文件出现在某个确切的文件夹中(具有异步功能)时等待,并在文件准备好时对文件执行某些操作。

但问题是,有时 Adob​​e Illustrator 会失败并且应用程序一直等待。在这种情况下,我不知道如何应用超时机制来终止 Adob​​e 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)

c# windows timeout

5
推荐指数
2
解决办法
1万
查看次数