我有一个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
答案 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();
}