在C#中按顺序执行线程

时间:2012-06-04 11:40:35

标签: c#

我有一个C#程序来winform应用程序。它旨在作为记忆游戏。首先,我必须在其中显示一个包含多个值的矩阵。说3或4.我必须暂停矩阵一段时间,以便用户将其保存在他的记忆中。为此,我使用thread1。然后我需要清空矩阵并在右侧面板上显示一些选项。它是使用Thread2完成的。现在的问题实际上是先执行thread2。任何人都可以帮助我。我是C#的新手......

Thread Thread1 = new Thread(new ParameterizedThreadStart(invokedisplaymatrix));
Thread1.IsBackground = true;
Thread1.Start(MatrixInfoValues);


            Thread Thread2 = new Thread(new ThreadStart(invokedisplayblankmatrix));
            Thread2.IsBackground = true;
            Thread2.Start();
}

 private void invokedisplaymatrix(object indx)
            {
    Invoke(new displaymatrixdelegate(displaymatrix),new object[] {indx});

Thread.sleep(5000);
              }

private void invokedisplayblankmatrix()
        {
Invoke(new displayblankmatrixdelegate(displayblankmatrix));
         }...

.. public delegate void displaymatrixdelegate(int[] ind1);
    public delegate void displayblankmatrixdelegate();
}//end of main form

4 个答案:

答案 0 :(得分:5)

创建Thread2并在invokedisplaymatrix结束时启动它。

但是,如果不打算进行任何并发,我不确定为什么要使用线程。

答案 1 :(得分:2)

您可能需要查看TPL。任务支持您的方案开箱即用(通过ContinueWith方法)。

我不确定为什么你在这里需要2个线程 - 在进行并行工作时线程很好用,这看起来不像这里的情况。

答案 2 :(得分:0)

您应该使用AutoResetEvent来实现它。

因此...

var sync = new AutoResetEvent();

var thread1 = new Thread(new ParameterizedThreadStart(invokedisplaymatrix));
thread1.IsBackground = true;
thread1.Start(MatrixInfoValues);


thread Thread2 = new Thread(new ThreadStart(invokedisplayblankmatrix));
thread2.IsBackground = true;
thread2.Start();

private void invokedisplaymatrix(object indx)
{
  Invoke(new displaymatrixdelegate(displaymatrix),new object[] {indx});
  Thread.sleep(5000);
  sync.Set();
}

private void invokedisplayblankmatrix()
{
  sync.Wait();
  Invoke(new displayblankmatrixdelegate(displayblankmatrix));
}

但是你不需要separete线程来实现这种情况,这是一个简单的线程任务。

答案 3 :(得分:0)

查看System.Threading.Semaphore:

在这个示例中我们需要运行“work2”委托fisrt:

static void Main(string[] args)
{
   var sem = new Semaphore(0, 1);

    Action<object> work1 = o =>
    {
        sem.WaitOne();
        Console.WriteLine("enter " + o);
        Thread.Sleep(2000);
        Console.WriteLine("exit " + o);
    };

    Action<object> work2 = o =>
    {
        Console.WriteLine("enter " + o);
        Thread.Sleep(2000);
        Console.WriteLine("exit " + o);
        sem.Release();
    };

    work1.BeginInvoke("first", ar => { }, null);
    work2.BeginInvoke("second", ar => { }, null);       

    Console.ReadKey();
}