【发布时间】:2014-12-17 09:27:06
【问题描述】:
我的 Winform(Class A) 使用 Class B 和 B类使用C类
C 类为我做了一些事情,它读取 Word 文档并检索数据并将其粘贴到 Excel 文件中。 我为此制作了一个单独的线程,所以我仍然可以移动 winform。
现在我希望我的进度条查看它正在处理的文件的值,从 0 到 amountoffiles。
仅在窗体处于活动窗口时更新。
我目前在 C 类中得到这个。我将 progressBar 作为参数从 A 类到 B 到 C 类。
private void SetValue(int value)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
try
{
if (this.pbar.InvokeRequired)
{
if (Doc_converter.Form1.ActiveForm != null)
{
SetTextCallback d = new SetTextCallback(SetValue);
Doc_converter.Form1.ActiveForm.Invoke(d, new object[] { value });
}
}
else
{
this.pbar.Value = value;
}
}
catch
{
//To do
}
}
delegate void SetTextCallback(int value);
有没有其他方法可以完成这项工作?
还是从 C 类到 A 类的委托?
请记住,它是与表单线程不同的线程。
编辑:忘了说我只能使用 .NET 4.0 或更低版本,因为应用程序必须在 windows xp 机器上运行。
【问题讨论】:
-
在 .NET 4.5 中,您可以使用 Progress
类将进度消息从后台线程发送到 UI 线程,从而避免 Invoke和 耦合与窗体的背景类。您使用的是哪个 .NET 版本? -
我使用的是 .NET 4.0,因为它必须在 Windows XP 机器上运行。
-
只要你有VS 2012+,你可以添加
Microsoft.Bcl.AsyncNuget包来获得async/await和Progress的支持。既然 VS 2013 Pro 是免费的,这应该不是问题 -
谢谢!我会调查一下,目前使用的是 VS2012。所以应该是可以的。
-
添加了一个示例作为答案
标签: c# multithreading winforms delegates