【发布时间】:2014-12-09 21:36:52
【问题描述】:
我正在尝试使用可以显示耗时任务进度的表单升级我的 winforms 应用程序,但无论我做什么,该表单都无法正常工作。这是我所拥有的:
- 设置:
有一个表单(Form1),只有一个按钮,代码如下:
public partial class Form1 : Form
{
CancellationTokenSource cToken = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
cToken = new CancellationTokenSource();
using (Form2 form = new Form2())
{
form.Show(); //Shows the 'progress' form
int i = 0;
Task.Factory.StartNew(() =>
{
while (cToken.Token.IsCancellationRequested == false && i <= 5) //Runs the task until it is cancelled or has reached its end
{
form.UpdateProgress(i); //Updates the 'progress' form
Thread.Sleep(500); //Waits simulating time consuming activity
i++;
}
}, cToken.Token, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()).Wait();
}
}
}
那么还有另外一个表单(Form2)是Form1在运行耗时操作时显示的:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
progressBar1.Step = 1;
progressBar1.Maximum = 6;
}
public void UpdateProgress(int i)
{
progressBar1.PerformStep();
label1.Text = string.Format("Step {0} of 6", i);
}
}
此表单有一个进度条、一个标签(显示百分比)和一个取消按钮。
- 预期行为:
当一个耗时的操作正在运行时,Form2(带有进度条的那个)将被显示,并且每次调用 UpdateProgress() 都会更新进度条和标签文本。同时,任何一个表单都不应或似乎被阻止,以便用户可以随时取消耗时的任务。
- 当前行为:
Form2 显示出来了,进度条更新正常,但是其他控件没有显示,两个表单都被屏蔽了。
- 其他信息:
我使用的是 C# 4.0,所以我不能使用 Progress,我想避免使用 BackgroundWorker 或事件(不是我不喜欢它们,我只是想使用 TPL)。
- 问题:
我有什么方法可以使用 TPL 实现我的目标吗?几天来我一直在谷歌搜索和阅读 MSDN 文档,但到目前为止还没有找到可行的解决方案。我在 stackoverflow 上遇到了很多主题,但它们主要展示了如何在同一个表单中异步更新进度条,我可以让它工作,但这不是我真正需要的。我很确定我错过了什么,但我不知道是什么。
【问题讨论】:
-
您可以将
Microsoft.Bcl.Async包添加到您的项目中,以便为您的应用程序添加async/await和Progress<T>支持,即使它是.NET 4.0 并清理延续
标签: c# winforms asynchronous task-parallel-library