2012-06-04 225 views
0

我有一个C#程序来winform应用程序。它的目的是作为一个记忆游戏。首先,我必须显示一个包含数值的矩阵。说3或4.我必须暂停矩阵一段时间,以便用户将其保存在他的记忆。为此,我使用thread1。然后我需要空白矩阵并在窗体的右侧显示一些选项。它使用Thread2完成。现在的问题实际上是首先执行thread2。谁能帮我please.I是新来的C#...在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 
+1

线程运行* *同时 - 他们做什么,他们将与现有的CPU给他们。如果你想让他们成为*,你可能意味着一个工作队列,而不是单独的线程。 –

回答

2

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

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

5

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

但是,我不确定为什么你要使用线程,但是并不意味着要进行任何并发。

+0

能否请你建议我如何在计时器/任何其他代码中做到这一点?非常感谢 – Kavitha

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线程来实现这种情况下,这是简单的一个线程任务。

+0

我无法声明autoreset event.Could你请教我如何使用单线程完成?我需要显示矩阵显示5秒,然后在答案面板中显示答案的选项。非常感谢。 – Kavitha

+0

您可以使用Timer执行此操作 –

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