我想创建一个辅助方法,可以接受委托并在后台线程上运行它,同时在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线程有机会在关闭之前处理更新进度条的消息。
有更好的(非解决方法)方法吗?