2009-11-30 149 views

回答

3

你需要得到線程:

  • 火災的事件,有人被 聽
  • 設置一個值別人 正在檢查
  • 設置等待事件 另一線程正在等待(例如AutoResetEvent或ManualResetEvent)
  • 返回 上一個無限連接()命令(在 那個線程上)

不幸的是,這些都不會使線程單獨存在或不會拉入其他線程,但這是多線程的喜悅。我通常會自己去開一場比賽。 Full Framework中的BackgroundWorker對象執行此操作,但不幸的是在CF中不可用,因此您必須親自編寫它(可能需要爲Thread類實現這個功能)。

+0

有兩個問題:如果我觸發了一個事件,這個事件將會在這個線程或主線程中運行。第二個問題是關於你的第三個可能性:AutoResetEvent會阻止應用程序? – VansFannel 2009-12-01 11:30:09

+0

如果您觸發該事件,它將位於後臺線程上。如果你打算更新UI,你將不得不通過.Invoke()或BeginInvoke()回傳到UI線程。如果你在一個句柄上等待,你將需要在這個等待(不推薦)時鎖定UI線程,或者讓另一個線程等待這個事件。但是,在後一種情況下,如果您想要觸摸UI,您仍然會遇到編組問題。另一種方法是讓UI線程在後臺線程完成時更新的計時器上查詢一個值(比如bool)(然後你不需要任何編組)。 – Quibblesome 2009-12-01 12:00:52

+0

我個人仍然會爲事件觸發加上編組我自己。 – Quibblesome 2009-12-01 12:02:36

1

由於您生成自己的線程,只要RetrieveSoMuchData(..)完成,線程將終止。

您可以使用EventWaitHandle通知您自己,如AutoResetEvent

+0

AutoResetEvent會阻止應用程序? – VansFannel 2009-12-01 11:33:17

+0

AutoResetEvent將阻塞(如果您在等待事件),直到您調用Set。 – 2009-12-01 17:01:18

相關問題