C#-Threading - 执行顺序

时间:2009-11-23 11:01:37

标签: c# multithreading

当我执行线程th1,th2和th3时,它们一个接一个地执行。如何更改我的代码,以便执行顺序不可预测。(不使用Random)。

public class Test
{
    static void Main()
    {

        Person p = new Person();
        p.Id = "cs0001";
        p.Name = "William";

        Thread th1 = new Thread(()=>ProcessOne(p));
        th1.Name = "ThreadOne";
        th1.Start();

        Thread th2 = new Thread(()=>ProcessTwo(p));
        th2.Name = "ThreadTwo";
        th2.Start();

        Thread th3 = new Thread(()=> ProcessThree(p));
        th3.Name = "ThreadThree";
        th3.Start();

        Console.ReadKey(true);
    }

    static void ProcessOne(Person p)
    {
         Console.WriteLine("Thread {0} is executing", 
         Thread.CurrentThread.Name);
          Console.WriteLine("Id :{0},Name :{1}", p.Id, p.Name);
    }

    static void ProcessTwo(Person p)
    {
        Console.WriteLine("Thread {0} is executing",
        Thread.CurrentThread.Name);
        Console.WriteLine("Id :{0},Name :{1}", p.Id, p.Name);
    }

    static void ProcessThree(Person p)
    {
        Console.WriteLine("Thread {0} is executing",
        Thread.CurrentThread.Name); 
        Console.WriteLine("Id :{0},Name :{1}", p.Id, p.Name);
    }
}

public class Person
{

    public string Id
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

}

4 个答案:

答案 0 :(得分:9)

在您的代码中,执行顺序是不可预测的。您看到顺序调用的原因是因为您的方法执行的工作很少,并且当您启动第一个已完成的下一个线程时。当我运行你的代码时,我得到了这个结果:

Thread ThreadOne is executing
Thread ThreadTwo is executing
Id :cs0001,Name :William
Thread ThreadThree is executing
Id :cs0001,Name :William
Id :cs0001,Name :William

可以清楚地看到这些方法并行执行。多次运行程序会得到不同的结果。

答案 1 :(得分:1)

如果您的线程运行得足够长,它们将开始以更随机的顺序执行。但是,如果线程在调试时非常快速地终止,则可以预期这种确定性行为。

您可能已尝试访问共享资源并导致踏板锁定保持以及取决于哪个线程可以获取锁定。

答案 2 :(得分:1)

您可以让ThreadPool类处理线程,而不是手动启动新线程。这样你的线程执行就会更加随机化,但如果ThreadPool很忙,你甚至可能会遇到延迟。

ThreadPool.QueueUserWorkItem(() => ProcessOne(p));

答案 3 :(得分:0)

可以在每个方法中使用Thread.Sleep(time)插入不同的延迟,分配不同的 睡眠的持续时间()。延迟将模拟正在进行的工作。

如果您调用以下内容,则会得到不同的序列:(而不是在创建后调用)

th1.Start();
th2.Start();
th3.Start();