我有一个执行许多任务的C#Windows应用程序。其中一些任务浪费时间。当我运行这些类型的任务时,我的应用程序的其他部分将被禁用。
如何编写应用程序以避免这种情况?使用线程是一个好的解决方案?这样安全吗?
答案 0 :(得分:3)
您可以尝试使用BackgroundWorker。
示例强>
您可能需要花费大量时间才能运行此方法:void HeavyLifting()
所以委托一些工作使用BackgroundWorker
!
var worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(someHeavyWork);
事件方法someHeavyWork在这种情况下只调用HeavyLifting。
要启动工作人员,只需执行以下操作:
worker.RunWorkAsync();
提示:更新GUI线程
请记住,如果您要通过此线程更改GUI线程中的内容,则需要使用invoke / delegates。您可以在MSDN上阅读此内容:How can I update my user interface from a thread that did not create it?
答案 1 :(得分:2)
非常nice online resource用于理解带有大量样本的.NET中的线程;由Joseph Albahari分享。
答案 2 :(得分:1)
你已经建议了后台工作人员。另一种方法是自己开始一个新的线程。
void main()
{
Thread worker = new Thread(new ThreadStart(DoStuff));
worker.Start();
}
private void DoStuff()
{
// long running work in here
}
如果你想引入DoStuff()方法的参数,你也可以使用ParameterizedThreadStart 。
答案 3 :(得分:1)
目前,您可以使用ThreadPool在非Windows窗体应用程序的程序中排队后台任务。在.NET 4.0中,并行编程有许多新功能(如Parallel LINQ,...)。 Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4对你来说可能很有趣。
干杯 的Matthias
答案 4 :(得分:1)
或者,如果您使用.net 4.0,您可以使用任务框架,这很好。但要小心不要从另一个线程写入UI控件。
答案 5 :(得分:0)
如前所述,使用BackgroundWorker并查看this answer和this answer。
答案 6 :(得分:-1)
尝试使用BackgroundWorker
创建一个BackGroundWorker(可在工具箱中找到)
创建DoWork事件(您可以在BGW属性的事件选项卡中访问此事件)
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
{
DoTimeConsumingTask();
}
并使用以下内容进行调用:
BGWorker.RunWorkerAsync();
您可以将变量传递给DoWork处理程序,该处理程序可以通过
进行访问e.Argument //(It comes as an Object, you can use int.Parse, .ToString() or whatever