如何在C#中将我的应用程序编写为多线程应用程序?

时间:2010-02-18 11:11:28

标签: c# .net multithreading

我有一个执行许多任务的C#Windows应用程序。其中一些任务浪费时间。当我运行这些类型的任务时,我的应用程序的其他部分将被禁用。

如何编写应用程序以避免这种情况?使用线程是一个好的解决方案?这样安全吗?

7 个答案:

答案 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 answerthis 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