在 C# 中按顺序执行线程

本文关键字:执行 线程 顺序 | 更新日期: 2023-09-27 18:36:21

我有一个C#程序来通知应用程序。它旨在作为记忆游戏。首先,我必须显示一个矩阵,其中包含许多值。比如说 3 或 4。我必须暂停矩阵一段时间,以便用户将其保存在他的内存中。为此,我使用线程 1。然后我需要空白矩阵并在右侧表单面板上显示一些选项。它是使用 Thread2 完成的。现在的问题实际上是线程 2 首先执行。谁能帮我。我是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

在 C# 中按顺序执行线程

创建 Thread2 并在调用显示矩阵结束时启动它。

但是,如果没有任何并发性,我不确定为什么要使用线程。

你可能想看看TPL。任务支持开箱即用的方案(通过 ContinueWith 方法)。

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

您应该使用 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));
}

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

查看 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();
}