簡體   English   中英

如何在c#中的DoWork事件中檢查以前運行的ProgressChanged是否已完成

[英]How can I check if previously running ProgressChanged has finished in DoWork event in c#

這是一個場景,它是一個winforms應用程序,其中有一組進程,這些進程在Backgroundworker類的DoWork事件中的for循環內逐個運行。 我在for循環中定期調用ReportProgress()以更新UI。

現在,當我調用ReportProgress()時,它會觸發ProgressChanged事件,在該事件中,我具有使用我先前在DoWork中設置的所有消息來更新UI的代碼。 但是由於它在單獨的線程中運行,因此控件在DoWork中並行運行,但是我想將for循環保持/等待一段時間,直到之前運行的ProgressChanged事件為止。

當前,我在for循環中調用Thread.Sleep(1000),然后在其中執行任何操作(例如拾取下一個進程並運行它),並且這段代碼為我提供了所需的輸出。 所以我只想檢查是否有其他解決方案(我不使用Thread.Sleep),我可以驗證/等待for循環,直到先前運行的ProgressChanged事件完成其工作為止,然后我繼續在for循環中運行集合中的下一個進程。

在不解決總體設計問題的情況下,使用信號量是實現此目的的方法。 最基本的示例是:

static Semaphore _semaphore = new Semaphore(0,1);
WorkStatus _workStatus;

void DoWork()
{
    _semaphore.WaitOne();
    try
    {
        _workStatus = Foo();  //Only one thread will be able to execute this at a time
    }
    finally
    {
        _semaphore.Release();
    }
}

void HandleProgressChanged()
{
    _semaphore.WaitOne(); //Wait for any DoWork threads to finish
    try
    {
        DisplayProgress(_workStatus);
    }
    finally
    {
        _semaphore.Release();
    }
    Task.Run(DoWork);
}

暫無
暫無

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

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