簡體   English   中英

在C#或.NET中,有沒有辦法阻止其他線程在特定線程上調用方法?

[英]In C# or .NET, is there a way to prevent other threads from invoking methods on a particular thread?

我有一個帶有BackgroundWorker的Windows窗體應用程序。 在主窗體上的方法中,將顯示MessageBox,用戶必須單擊“確定”按鈕才能繼續。 同時,在顯示消息框時,BackgroundWorker完成執行並調用RunWorkerCompleted事件。 在我分配給在UI線程上運行的事件的方法中,在窗體上調用Close方法。 即使顯示消息框的方法仍在運行,UI線程也不會阻止其他線程對其調用方法。 因此,在窗體上調用Close方法。 我想要的是UI線程阻止其他線程的調用,直到帶有消息框的方法完成。 有一個簡單的方法嗎?

我認為你應該對你的事件如何處理更加自律。 您不希望停止在UI線程上調用的方法,因為方法調用機制與允許鼠標和鍵盤事件之類的操作相同。 如果阻止方法調用,您也將阻止它。 相反,你需要以某種方式延遲方法。 您可能需要編寫自己的同步代碼來執行此操作。

使用ManualResetEvent控制RunWorkCompleted事件和顯示MessageBox的方法之間的同步。

你可以使用一個簡單的lock 在表單中,創建一個表單級別的成員,如下所示:

private object _locker = new object();

然后讓你的代碼獲取兩種方法中的鎖,如下所示:

private void RunWorkerCompleted()
{
    lock (_locker)
    {
        this.Close();
    }
}

private void ShowSomeMessage()
{
    lock (_locker)
    {
        MessageBox.Show("message");
    }
}

如果您的代碼當前在ShowSomeMessage()阻塞(即消息框仍處於打開狀態), RunWorkerCompleted()方法將等到消息框關閉(釋放鎖定)之后關閉表單。

更新:這應該工作,無論哪個線程調用什么:

private bool _showingMessage = false;

然后讓你的代碼獲取兩種方法中的鎖,如下所示:

private void RunWorkerCompleted()
{
    while (_showingMessage)
    {
        Thread.Sleep(500); // or some other interval (in ms)
    }
    this.Close();
}

private void ShowSomeMessage()
{
    _showingMessage = true;
    MessageBox.Show("message");
    _showingMessage = false;
}

暫無
暫無

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

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