gpt4 book ai didi

c# - 将后台 worker 更新为异步等待

转载 作者:太空狗 更新时间:2023-10-29 18:15:56 26 4
gpt4 key购买 nike

这就是我目前使用后台工作程序将大量内容保存到文件的方式,同时向用户显示进度条并防止在保存过程中对 UI 进行任何更改。我想我已经掌握了基本特征。模态 ProgressWindow 显示一个进度条,仅此而已。如果必须的话,我将如何将其更改为 async-await 模式?

private ProgressForm ProgressWindow { get; set; }

/// <summary>On clicking save button, save stuff to file</summary>
void SaveButtonClick(object sender, EventArgs e)
{
if (SaveFileDialog.ShowDialog() == DialogResult.OK)
{
if (!BackgroundWorker.IsBusy)
{
BackgroundWorker.RunWorkerAsync(SaveFileDialog.FileName);
ProgressWindow= new ProgressForm();
ProgressWindow.SetPercentageDone(0);
ProgressWindow.ShowDialog(this);
}
}
}

/// <summary>Background worker task to save stuff to file</summary>
void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
string path= e.Argument as string;

// open file

for (int i=0; i < 100; i++)
{
// get some stuff from UI
// save stuff to file
BackgroundWorker.ReportProgress(i);
}

// close file
}

/// <summary>On background worker progress, report progress</summary>
void BackgroundWorkerProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressWindow.SetPercentageDone(e.ProgressPercentage);
}

/// <summary>On background worker finished, close progress form</summary>
void BackgroundWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ProgressWindow.Close();
}

最佳答案

我有一个 blog series详细介绍了这一点。

简而言之,BackgroundWorkerTask.Run 取代, 和 ReportProgress (和 friend )被替换为 IProgress<T> .

所以,一个简单的翻译应该是这样的:

async void SaveButtonClick(object sender, EventArgs e)
{
if (SaveFileDialog.ShowDialog() == DialogResult.OK)
{
ProgressWindow = new ProgressForm();
ProgressWindow.SetPercentageDone(0);
var progress = new Progress<int>(ProgressWindow.SetPercentageDone);
var task = SaveAndClose(SaveFileDialog.FileName, progress));
ProgressWindow.ShowDialog(this);
await task;
}
}

async Task SaveAndClose(string path, IProgress<int> progress)
{
await Task.Run(() => Save(path, progress));
ProgressWindow.Close();
}

void Save(string path, IProgress<int> progress)
{
// open file

for (int i=0; i < 100; i++)
{
// get some stuff from UI
// save stuff to file
if (progress != null)
progress.Report(i);
}

// close file
}

改进说明:

  • 让后台线程进入 UI 通常不是一个好主意 (// get some stuff from UI)。如果您可以在 调用 Task.Run 之前从 UI 收集所有信息,它可能会更好。并将其传递给 Save方法。

关于c# - 将后台 worker 更新为异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com