2015-07-13 175 views
0

我是新来的C#和多线程。我有这个代码来开始使用多线程,但时钟滴答没有开始。这段代码有什么问题?没有错误发生,因为我猜想它是一个逻辑错误。任何帮助,将不胜感激。线程未启动

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 
namespace Implementing_Databases 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      picturebox1.Location=new Point(0,20); 
      pictureBox2.Location = new Point(0, 60); 
     } 
     int B1 = 0; 
     int B2 = 0; 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      Thread Th1 = new Thread(Go1); 
      Thread Th2 = new Thread(Go2); 
      Th1.Start(); 
      Th2.Start(); 

     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 

      picturebox1.Left = B1; 
      B1 += 5; 

     } 

     private void timer2_Tick(object sender, EventArgs e) 
     { 

      pictureBox2.Left = B2; 
      B2 += 5; 

     } 
     void Go1() 
     { 
      timer1.Start(); 
     } 
     void Go2() 
     { 
      timer2.Start(); 
     } 




    } 
} 
+0

我没有看到任何定时器声明? –

+0

我使用了工具箱中的计时器。我猜这是背景声明? – wish568

+0

为什么不从'Form1_Load'方法调用'timer1.Start()'。在'Thread'中包装它在这种情况下不会存档。 – Dzienny

回答

0

首先,尝试将线程声明为属性的形式,而不是将它们声明为本地函数变量。因为否则它们可能会在Load处理程序退出后立即被GC收集。

其次,UI不更新可能是由于您无法从非GUI线程更新UI数据。请参阅WinForms编程的InvokeRequired/Invoke功能。有关更多详细信息,请参见https://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired(v=vs.110).aspx

+0

他只是从后台线程启动计时器。 –

+0

刻度回调将由计时器线程调用。哪些不是GUI – ninjaboy

+0

我曾尝试将这些线程声明为Form的属性。仍然没有收获。 – wish568