在 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
创建 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();
}