簡體   English   中英

C#等待其他線程

[英]C# wait for other threads

我沒有找到能夠適應我的問題的答案。

這就是這種情況:我需要測試12個網絡攝像機的功能,所有這些工作都相同。 因此,我正在啟動12個線程,並連接到攝像機。

每個線程都在發送一個激活命令,然后等待10秒鍾以獲取響應,這是不希望的。

在這10秒鍾之后,線程應進入等待狀態並通知主線程有關此信息。

一旦所有12個線程都處於等待狀態,就通過串行連接發送命令,並且線程應繼續其工作。 現在他們應該會得到答案。

到目前為止,我已經啟動了12個線程,但是我不知道如何在這一點上使它們同步。

有什么幫助嗎?

到目前為止的代碼:

Dictionary<String, Thread> tl = new Dictionary<String, Thread>();
Thread t;
foreach (String ip in this.ips) {
    t = new Thread(new ParameterizedThreadStart(camWorker));
    tl.Add(ip, t);
    tl[ip].Start();
}

但是,如果需要,可以將其重建以為每個線程創建單獨的類實例。

您可以使用重置事件。 為每個線程創建一個重置事件,最后,等待所有12個重置事件完成。

例:

var resetEvents = new List<AutoResetEvent>();
for (int i = 0; i < 12; i++)
{
   var re = new AutoResetEvent(false);
   resetEvents.Add(re);

   ThreadPool.QueueUserWorkItem(w =>
   {
       var threadReset = w as AutoResetEvent;
       var random = new Random();
       try
       {
          // do something.
          Thread.Sleep(random.Next(100, 2000));
       }
       catch (Exception ex)
       {
          // make sure you catch exceptions and release the lock.
          // otherwise you will get into deadlocks
       }

       // when ready:
       Console.WriteLine("Done thread " + Thread.CurrentThread.ManagedThreadId);
       threadReset.Set();
    }, re);
}

// this bit will wait for all 12 threads to set
foreach (AutoResetEvent resetEvent in resetEvents)
{
   resetEvent.WaitOne();
}

// At this point, all 12 of your threads have signaled that they're ready.
bool[] timeout = new bool[12];
bool waitForSignal = true;
oneof12()
{
    while(true)
    {
        if(receivedatabeforetimeout())
        {


        }
        else
            timeout[0] = true;
        while(waitForSignal)
            Thread.Sleep(500);
    }
}

watcherThread()
{
    bool allTimeout = true;
    for(int a = 0; a<12;a++)
        if(!timeout[0])
            allTimeout = false;

    if(allTimeout)
    {
        for(int a = 0; a<12;a++)
            timeout[a] = false;
        waitForSignal = false;
    }
Thread.Sleep(200);
}

這樣的事情適合您的情況嗎? 如果超時,則12個線程中的每個線程都會將bool數組中的索引設置為true。 監視線程檢查bool數組是否全部12個都超時,並且是否將其設置為true,從而將waitForSignal標志設置為true,這將導致12個線程退出while循環並再次等待數據

這聽起來像是Tasks的好案例。 本質上,您可以等待12個任務,每個任務都檢查一台攝像機的狀態。 這樣做的好處是您不必管理獨立線程。

using System.Linq;
using System.Threading.Tasks;

...

var Tasks = this.ips.Select(ip => Task.Run(() => Check(ip))).ToArray();

Task.WaitAll(Tasks);

//inspect Task.Result to display status and perform further work

請注意,您的Check方法可以返回結果,然后可以通過Task.Result訪問。 Task.WaitAll阻止當前線程,直到所有任務運行完畢。

目前尚不清楚您將從何處調用此代碼,但是如果合適,您也可以使用C#的異步功能。

我建議為此使用任務。

List<Task> tasks = new List<Task>();

for (int i=0; i<10; i++)
{
    tasks.Add(Task.Factory.StartNew(() => DoSomething());
}

Task.WaitAll(tasks);

這將使所有任務在后台並行運行,並將等待所有任務完成才能繼續。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM