如何在C#中同时启动多个线程?

时间:2015-10-10 02:26:48

标签: c# multithreading asynchronous timer

我的项目有两个使用System.Timer的线程

Thread t1, t2;
t1 = new Thread(Timer_product);
t2 = new Thread(Timer_money);
t1.Start();
t2.Start(); 

当我运行应用程序时,它始终从t1开始,但不会启动t2。

如果我将订单更改为

t2.Start();
t1.Start();

再次运行我的应用程序,t1不启动,但t2启动。

4 个答案:

答案 0 :(得分:0)

线程执行的顺序并不重要,如下所示。我怀疑你的问题在于 Timer_money 或可能是 Timer_product

示例:

void Main()
{
    Thread t1, t2;
    t1 = new Thread(t => { Console.WriteLine("T1 is running");});
    t2 = new Thread(t => { Console.WriteLine("T2 is running");});
    t1.Start();
    t2.Start(); 
}

结果:

  

T1正在运行
  T2正在运行

现在是相同的线程,但执行顺序相反。

void Main()
{
    Thread t1, t2;
    t1 = new Thread(t => { Console.WriteLine("T1 is running");});
    t2 = new Thread(t => { Console.WriteLine("T2 is running");});
    t2.Start(); 
    t1.Start();
}

结果:

  

T2正在运行
  T1正在运行

答案 1 :(得分:0)

使用计时器时根本不需要线程,因为计时器已经使用了它自己的线程。 Take a look at code

因此,如果您使用两个不同的计时器,则可能需要线程同步。查看我的answer how to synchronize threads

答案 2 :(得分:-3)

如何使用Parallel.Invoke()?

Parallel.Invoke(Timer_product, Timer_money);

如果这两项都不起作用,问题应该在Timer_product或Timer_money中。它会帮助你找出问题所在。

答案 3 :(得分:-4)

Parallel.Invoke方法提供了一种同时运行任意数量的任意语句的便捷方法。只需为每个工作项传递一个Action委托。创建这些委托的最简单方法是使用lambda表达式。

以下示例显示了一个基本的Invoke调用,该调用创建并启动两个并发运行的任务。第一个任务由调用名为DoSomeWork的方法的lambda表达式表示,第二个任务由调用名为DoSomeOtherWork.的方法的lambda表达式表示

Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());