代码之家  ›  专栏  ›  技术社区  ›  masoud ramezani

如何用C语言将应用程序编写为多线程应用程序?

  •  0
  • masoud ramezani  · 技术社区  · 15 年前

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

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

    7 回复  |  直到 15 年前
        1
  •  1
  •   Ian    15 年前

    你已经建议了背景工作者。另一种方法是自己开始一个新的线程。

    void main()
    {
       Thread worker = new Thread(new ThreadStart(DoStuff));
       worker.Start();
    }
    
    private void DoStuff() 
    {
      // long running work in here
    }
    

    您也可以使用 ParameterizedThreadStart 如果要向dostuf()方法中加入参数。

        2
  •  3
  •   Matt Davis    15 年前

    您可以尝试的第一件事是使用 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?

        3
  •  2
  •   Kamran Khan    15 年前

    非常 nice online resource 了解.NET中的线程处理,有许多示例;由Joseph Albahari共享。

        4
  •  1
  •   Matthias Meid    15 年前

    目前,您可以使用 ThreadPool 在不是Windows窗体应用程序的程序中对后台任务进行排队。在.NET 4.0中,有许多新的并行编程特性(比如parallel linq,…)。 Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4 可能对你有意思。

    干杯 马蒂亚斯

        5
  •  1
  •   Pablo Castilla    15 年前

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

        6
  •  0
  •   Community CDub    8 年前

    如前所述,使用后台工作人员并查看 this answer this answer .

        7
  •  -1
  •   Marcelo    15 年前

    试用使用 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