C# 仅当任务未在指定时间内完成时显示“进度”对话框

C# 仅当任务未在指定时间内完成时显示“进度”对话框,c#,.net,task-parallel-library,async-await,C#,.net,Task Parallel Library,Async Await,我有一个上传图像的小服务,我这样使用它: ImageInfo result = await service.UploadAsync(imagePath); 我想做的是显示一个进度对话框,但前提是上传操作需要2秒钟以上。上传完成后,我想关闭进度对话框 我用Task/ContinueWith做了一个粗略的解决方案,但我希望有一个更“优雅”的方法 如何使用async/await实现这一点?可能是这样的 var uploadTask = service.UploadAsync(imagePath);

我有一个上传图像的小服务,我这样使用它:

ImageInfo result = await service.UploadAsync(imagePath);
我想做的是显示一个进度对话框,但前提是上传操作需要2秒钟以上。上传完成后,我想关闭进度对话框

我用Task/ContinueWith做了一个粗略的解决方案,但我希望有一个更“优雅”的方法


如何使用
async/await
实现这一点?

可能是这样的

var uploadTask = service.UploadAsync(imagePath);
var delayTask = Task.Delay(1000);//Your delay here
if (await Task.WhenAny(new[] { uploadTask, delayTask }) == delayTask)
{
    //Timed out ShowProgress
    ShowMyProgress();
    await uploadTask;//Wait until upload completes
    //Hide progress
    HideProgress();
}

我想我还是会发布我的解决方案,因为它演示了如何显示和关闭一个模态对话框。它适用于WPF,但同样的概念也适用于WinForms

private async void OpenCommand_Executed(object sCommand, ExecutedRoutedEventArgs eCommand)
{
    // start the worker task
    var workerTask = Task.Run(() => {
        // the work takes at least 5s
        Thread.Sleep(5000);
    });

    // start timer task
    var timerTask = Task.Delay(2000);
    var task = await Task.WhenAny(workerTask, timerTask);

    if (task == timerTask)
    {
        // create the dialog
        var dialogWindow = CreateDialog();

        // go modal
        var modalityTcs = new TaskCompletionSource<bool>();

        dialogWindow.Loaded += (s, e) =>
            modalityTcs.SetResult(true);

        var dialogTask = Dispatcher.InvokeAsync(() =>
            dialogWindow.ShowDialog());

        await modalityTcs.Task;

        // we are now on the modal dialog Dispatcher frame
        // the main window UI has been disabled

        // now await the worker task
        await workerTask;

        // worker task completed, close the dialog
        dialogWindow.Close();
        await dialogTask;

        // we're back to the main Dispatcher frame of the UI thread
    }
}
private async void OpenCommand_已执行(对象sCommand,已执行路由Eventargs eCommand)
{
//启动辅助任务
var workerTask=Task.Run(()=>{
//这项工作至少需要5秒
睡眠(5000);
});
//启动计时器任务
var timerTask=任务延迟(2000);
var task=等待任务.WhenAny(workerTask,timerTask);
如果(任务==timerTask)
{
//创建对话框
var dialogWindow=CreateDialog();
//去模态
var modalityTcs=new TaskCompletionSource();
dialogWindow.Loaded+=(s,e)=>
modalityTcs.SetResult(true);
var dialogTask=Dispatcher.InvokeAsync(()=>
dialogWindow.ShowDialog());
等待模式任务;
//我们现在在模态对话框调度程序框架上
//主窗口UI已被禁用
//现在等待工人的任务
等待工作任务;
//工作任务已完成,请关闭对话框
dialogWindow.Close();
等待对话任务;
//我们回到UI线程的主调度程序框架
}
}

您是在寻找模态对话框还是非模态对话框?WPF还是WinForms?@Noseratio这不是我遇到的问题,这是在没有丑陋的回调汤的情况下让它显示的正确魔力:)非常类似于我最后所做的!谢谢Sriram和@IgalTabachnik,如果
ShowMyProgress
在这里显示一个模态或非模态对话框,我仍然很抱歉。@IgalTabachnik,用户在操作过程中仍然可以访问主窗口用户界面,因为该对话框是非模态的,您同意吗?@noserio如果它是模态对话框,则此逻辑将被破坏:(谢谢你的编辑,那是个打字错误