允许UI处理来自IProgress <t>的所有消息

时间:2015-12-22 09:08:26

标签: c# user-interface asynchronous async-await

我想创建一个辅助方法,可以接受委托并在后台线程上运行它,同时在UI中显示方法的进度。 UI显示带有取消按钮的非选取框进度条,并且是模态的;这实际上是一个同步操作,但我希望保持UI响应并显示操作的进度。

UI应该打开,运行委托,然后关闭。问题是有时UI会在所有进度报告被“处理”之前关闭,即在UI关闭之前进度条并不总是达到100%。

以下是代码:

public static void Execute(Action<IProgress<ProgressInfo>> action, IWin32Window parent)
{
    using (var progressDialog = new ProgressDialog())
    {
        progressDialog.Shown += async (sender, args) =>
        {
            ProgressDialog dialog = (ProgressDialog)sender;

            await Task.Run(() =>
            {
                action(dialog.Progress);

                if (!dialog.CancellationToken.IsCancellationRequested)
                {
                    // this is a workaround: we need time for the UI to update and show 100% progress before closing
                    Thread.Sleep(1000);
                }
            }, dialog.CancellationToken);

            dialog.Close();
        };

        progressDialog.ShowDialog(parent);
    }
}

解决方法只是在关闭对话框之前等待一段时间,以便让UI线程有机会在关闭之前处理更新进度条的消息。

有更好的(非解决方法)方法吗?

0 个答案:

没有答案