c# - 如何将 ProgressBar 与 Async 一起使用?
问题描述
使用 backgroundworker 控制进度条使我的项目在某个地方之后变得困难。在这种情况下,我决定转向异步结构,我在异步结构上构建架构。但是这次我不知道如何控制异步结构下的进度条。
private async void button3_Click(object sender, EventArgs e)
{
progressBar1.Value = 1;
int value = 1;
await ProgressBarControl(value);
await Convert();
}
public Task ProgressBarControl(int e)
{
return Task.Run(() =>
{
var progress = new Progress<int>(percent =>
{
progressBar1.Value = percent;
});
});
}
但它不起作用。我使用了后台工作人员。我在问这个问题。但是你们向我建议了背景工作者。但是后台工作人员,一段时间后出现错误并且系统没有回复我?
解决方案
这个问题不清楚。无论如何,BackgroundWorker 自 2012 年以来已过时。
如果您想报告任何后台线程的进度,而不仅仅是使用创建的线程,请在 UI 线程中Task.Run
创建 aProgress<T>
并将其仅作为 anIProgress<T>
传递给后台线程或任务,例如:
private async void button3_Click(object sender, EventArgs e)
{
var progress = new Progress<int>(percent =>
{
progressBar1.Value = percent;
});
progressBar1.Value = 1;
int value = 100;
await DoSomeWork(value,progress);
}
public Task DoSomeWork(int iterations,IProgress<int> progress)
{
for(int i=0;i<iterations;i++)
{
await Task.Run(()=>{
DoSomethingReallySlow(i);
progress.Report(i*100/iterations));
});
}
}
检查4.5 中的异步:在异步 API中启用进度和取消,以获取进度报告和取消的示例
推荐阅读
- function - Pyspark - 在两个字符串列上合并导致错误 - 无法转换为结构
- vue.js - 通过槽向子组件添加多个组件
- rust - 如果我在调用 present 之前更改画布的 vew_port,为什么会有旧图像闪烁?
- node.js - ReferenceError: _id 未定义
- android - RecyclerView 包装了它的内容
- javascript - 如何在 Microsoft Playwright 中创建自动化 API 测试?
- c++ - 如何在 C++ 中使用类和对象重载 << 运算符
- c# - 将 JSON 从 AJAX 发送到控制器类
- regex - 正则表达式模式来捕获一段字符串
- reactjs - 钩子的 React.js 同步问题。连接四个游戏移动