0

我有一个用于 winform 应用程序的 C# 程序。它旨在作为一种记忆游戏。首先,我必须显示一个包含多个值的矩阵。说 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

4 回答 4

5

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

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

于 2012-06-04T11:43:39.600 回答
2

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

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

于 2012-06-04T11:43:18.760 回答
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));
}

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

于 2012-06-04T12:27:59.783 回答
0

看看 System.Threading.Semaphore:

在此示例中,我们需要先运行“work2”委托:

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();
}
于 2013-06-19T09:40:50.000 回答