Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用C编写多线程应用程序?_C#_.net_Multithreading - Fatal编程技术网

C# 如何用C编写多线程应用程序?

C# 如何用C编写多线程应用程序?,c#,.net,multithreading,C#,.net,Multithreading,我有一个C Windows应用程序,它可以执行许多任务。其中一些任务非常浪费时间。当我运行这些类型的任务时,应用程序的其他部分将被禁用 如何编写应用程序来避免这种情况?使用线程是一个好的解决方案吗?安全吗?试试使用 创建工具箱中可用的BackGroundWorker 创建DoWork事件您可以在BGW属性的事件选项卡中访问此事件 private void BGWorker_DoWork(object sender, DoWorkEventArgs e) { DoT

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

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

试试使用

创建工具箱中可用的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

您可以尝试的第一件事是使用

范例

您可能有这样一种运行时间很长的方法:void HeavyLifting

因此,要委派一些工作,请使用后台工作人员

在本例中,事件方法someHeavyWork只调用HeavyLifting

要启动worker,只需执行以下操作:

worker.RunWorkAsync

提示:更新GUI线程


请记住,如果要通过该线程更改GUI线程中的内容,则需要为此使用invoke/delegate。您可以在MSDN上了解这一点:

您已经得到了后台工作人员的建议。另一种方法是自己开始一个新线程

void main()
{
   Thread worker = new Thread(new ThreadStart(DoStuff));
   worker.Start();
}

private void DoStuff() 
{
  // long running work in here
}

如果要向DoStuff方法中插入参数,也可以使用。

当前,可以使用来对非Windows窗体应用程序中的后台任务进行排队。在.NET4.0中,并行编程有许多新特性,如并行LINQ等。。。。你可能会感兴趣

干杯
Matthias

非常有助于理解.NET中的线程,有很多示例;由Joseph Albahari共享。

如前所述,使用BackgroundWorker并查看和。

或者如果您使用.net 4.0,您可以使用任务框架,这很好。但是要小心不要从另一个线程写入UI控件。

我支持这一点-Albahari的论文是一个很好的起点。
void main()
{
   Thread worker = new Thread(new ThreadStart(DoStuff));
   worker.Start();
}

private void DoStuff() 
{
  // long running work in here
}