dav*_*der 16 c# asynchronous async-await
我正在使用异步/等待从数据库异步加载我的数据,在加载过程中,我想弹出一个加载表单,它只是一个带有运行进度条的简单表单,表示有一个正在运行的进程.加载数据后,对话框将自动关闭.我怎样才能做到这一点?以下是我目前的代码:
protected async void LoadData()
{
ProgressForm _progress = new ProgressForm();
_progress.ShowDialog() // not working
var data = await GetData();
_progress.Close();
}
Run Code Online (Sandbox Code Playgroud)
更新:
我设法通过更改代码来使其工作:
protected async void LoadData()
{
ProgressForm _progress = new ProgressForm();
_progress.BeginInvoke(new System.Action(()=>_progress.ShowDialog()));
var data = await GetData();
_progress.Close();
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方式还是有更好的方法?
谢谢你的帮助.
nos*_*tio 12
Task.Yield像这样很容易实现(WinForms,为简单起见,没有异常处理):
namespace WinFormsApp
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
async Task<int> LoadDataAsync()
{
await Task.Delay(2000);
return 42;
}
private async void button1_Click(object sender, EventArgs e)
{
var progressForm = new Form() {
Width = 300, Height = 100, Text = "Please wait... " };
var progressFormTask = progressForm.ShowDialogAsync();
var data = await LoadDataAsync();
progressForm.Close();
await progressFormTask;
MessageBox.Show(data.ToString());
}
}
internal static class DialogExt
{
public static async Task<DialogResult> ShowDialogAsync(this Form @this)
{
await Task.Yield();
if (@this.IsDisposed)
return DialogResult.OK;
return @this.ShowDialog();
}
}
}
Run Code Online (Sandbox Code Playgroud)
重要的是要理解执行流如何跳转到新的嵌套消息循环(模式对话框的循环),然后返回到原始消息循环(这await progressFormTask就是用于).
ShowDialog()是一个阻塞调用;await在用户关闭对话框之前,执行不会前进到该语句。Show()代替使用。不幸的是,您的对话框不是模态的,但它会正确跟踪异步操作的进度。
| 归档时间: |
|
| 查看次数: |
13256 次 |
| 最近记录: |