2014-08-30 217 views
0

在這我使用秒錶。當0之間秒錶值至15就會起到在屏幕1的視頻和15後,將在屏幕上顯示0但線程中執行Thread.sleep()線程無法啓動後線程Sleeep

public partial class Form2 : Form 
{ 
    int[] screentimings = new int[2] { 20, 20 }; 
    Stopwatch sp; 
    Thread thread1; 
    //private System.Timers.Timer _timer = new System.Timers.Timer(); 

    public Form2() 
    { 
     InitializeComponent(); 
     thread1 = new Thread(new ThreadStart(A)); 
     thread1.SetApartmentState(ApartmentState.STA); 
     sp = new Stopwatch(); 
     sp.Start(); 
     thread1.Start();   
    } 
     [STAThread] 
    public void showOnMonitor(int showOnMonitor) 
    { 
     Screen[] sc; 
     sc = Screen.AllScreens; 
     Form1 f = new Form1(); 
     f.FormBorderStyle = FormBorderStyle.None; 
     f.Left = sc[showOnMonitor].Bounds.Left; 
     f.Top = sc[showOnMonitor].Bounds.Top; 
     f.Height=sc[showOnMonitor].Bounds.Height; 
     f.Width=sc[showOnMonitor].Bounds.Width; 
     f.StartPosition = FormStartPosition.Manual; 
     f.ShowDialog(); 
    } 

    [STAThread] 
    private void A() 
    { 
     long i = sp.Elapsed.Seconds; 
     if (i > 0 && i < 15) 
     { 
      showOnMonitor(1); 
     } 
     else 
     { 
      showOnMonitor(0); 
     } 
     Thread.Sleep(500); 
    } 
} 

showOnMonitor(1)代碼之後,但15秒後沒有啓動showOnMonitor (0)不起作用。 我是新的線程不知道什麼是錯的。這可能是因爲[STAThread]沒有它給單線程異常。

+1

你的void A沒有任何循環,所以它執行一次並且線程結束。 – 2014-08-30 10:41:13

+0

我是新的線程問題可以是愚蠢的。我認爲void A()被線程一遍又一遍地調用。 – 2014-08-30 10:44:09

+1

如果你想一次又一次地調用某些東西,你需要使用'Timer'。 – 2014-08-30 10:46:31

回答

2

你並不需要一個線程都沒有。線程用於同時執行多個操作。解釋它將超出這個問題的範圍。請閱讀有關線索here的更多信息。

既然你是在.Net 4.5中,你可以使用async/await來很容易地完成你的目標

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    protected async override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     await ShowForms();//Show the forms 
    } 

    private async Task ShowForms() 
    { 
     ShowOnMonitor(1); 
     await Task.Delay(15000);//15 seconds, adjust it for your needs. 
     ShowOnMonitor(2); 
    } 

    private void ShowOnMonitor(int showOnMonitor) 
    { 
     Screen[] allScreens = Screen.AllScreens; 
     Rectangle screenBounds = allScreens[showOnMonitor - 1].Bounds; 
     Form1 f = new Form1 
     { 
      FormBorderStyle = FormBorderStyle.None, 
      Left = screenBounds.Left, 
      Top = screenBounds.Top, 
      Height = screenBounds.Height, 
      Width = screenBounds.Width, 
      StartPosition = FormStartPosition.Manual 
     }; 
     f.Show();//Use show, not ShowDialog. 
    } 
} 
+0

爲什麼你使用'async void'而不是'async Task'? 'ShowForms'不是一個事件處理程序。你還應該在'OnLoad'內部'await',所以從'ShowForms'傳播的任何異常都不會被處理。 – 2014-09-01 07:26:48

+1

@YuvalItzchakov沒理由,它剛剛發生。更新我的答案,謝謝。 – 2014-09-01 07:30:54

+0

@SriramSakthivel我認爲它會調用ShowForms()只有一次,但希望它每3秒後定期調用ShowForms()。我嘗試使用System.Timer,但因爲它運行在多個線程,現在我必須調用所有的過程單線程,因爲我使用Windows媒體播放器播放視頻和多線程它會引發交叉線程異常 – 2014-09-02 02:24:44