2013-10-23 134 views

回答

6

您可以使用Thread.IsAlive來檢查Thread是否正在運行。這就是說,如果您使用C#4,那麼手動創建「線程」並不是一個好主意。你應該考慮使用TPL和類,因爲這提供了一個非常乾淨的模型,用於在任務完成後附加工作以運行,將數據從操作中拉出等。

+0

現在任務優先於.NET 4中的BackgroundWorker?我剛剛瞭解到Task,但似乎沒有訂閱像BackgroundWorker的事件。 –

+0

@StealthRabbi一般來說,你可以做同樣的事情,你會用BW來完成任務。持續性和調度程序使您可以完成大部分相同的概念。在C#5中,async/await使用Task,真正使BW完全廢棄,IMO。有關用戶界面工作任務的信息,請參閱http://reedcopsey.com/2010/04/19/parallelism-in-net-part-17-think-continuations-not-callbacks/。 –

0

我使用Mutex來驗證這一點。有時只需驗證線程是否處於活動狀態,如果您在Background上運行,Thread.IsAlive並不安全。

試試這個:

private void btnDoSomething() 
{ 
    try 
    { 
     string nameThread = "testThreadDoSomething"; 

     var newThread = new Thread(delegate() { this.DoSomething(nameThread); }); 
     newThread.IsBackground = true; 
     newThread.Name = nameThread; 
     newThread.Start(); 

     //Prevent optimization from setting the field before calling Start 
     Thread.MemoryBarrier(); 
    } 
    catch (Exception ex) 
    { 

    } 
} 

public void DoSomething(string threadName) 
{ 
    bool ownsMutex; 

    using (Mutex mutex = new Mutex(true, threadName, out ownsMutex)) 
    { 
     if (ownsMutex) 
     { 
      Thread.Sleep(300000); // 300 seconds 

      if (Monitor.TryEnter(this, 300)) 
      { 
       try 
       { 
        // Your Source 
       } 
       catch (Exception e) 
       { 
        string mensagem = "Error : " + e.ToString(); 
       } 
       finally 
       { 
        Monitor.Exit(this); 
       } 
      } 

      //mutex.ReleaseMutex(); 
     } 
    } 
} 
相關問題