簡體   English   中英

線程安全事件 - 這是一種“干凈”的方式嗎?

[英]Thread-safe events - is this a “clean” way?

我偶然發現了專業庫中的一些代碼,並且不確定這是否是一種處理跨線程事件調用的簡潔方法。

下面的代碼在表單應用程序中。 線程調用是從一個本身啟動新線程並接收消息的類中進行的:

private void Library_StatusChanged(object sender, AbstractTestCase.StatusChangedEventArgs e)
{
    if (this.InvokeRequired)
    {
        this.lblProgress.Invoke((MethodInvoker)delegate ()
        {
            lblProgress.Text = "Current state: " + e.Step;
            lblProgress.Refresh();
        }
        );

        this.pbProgess.Invoke((MethodInvoker)delegate ()
        {
            pbProgess.Value = e.Percentage;
            pbProgess.Refresh();
        });

        this.lstStatus.Invoke((MethodInvoker)delegate ()
        {
            lstStatus.Items.Add("    " + e.Step);
            lstStatus.Refresh();

        });

        this.Invoke((MethodInvoker)delegate ()
        {
            this.Refresh();
        });
    }
    else
    {
        lblProgress.Text = "Current state:" + e.Step;
        lblProgress.Refresh();

        pbProgess.Value = e.Percentage;
        pbProgess.Refresh();

        lstStatus.Items.Add("    " + e.Step);
        lstStatus.Refresh();

        this.Refresh();
    }

    Application.DoEvents();
}

這是“最先進的”嗎? 在我看來這有點亂??!

現有技術正在使用await 如果在這里不可能,至少將代碼簡化為單個Invoke調用。 不需要在每個控件上調用,只需在UI線程上的任何位置調用。

不應該要求InvokeRequired檢查,因為您應該知道引發事件的線程。

在任何情況下,重復邏輯,如"Current state: " + e.Step真的是一個壞主意,我會在代碼審查中失敗,無論如何。

Application.DoEvents的存在是一個非常糟糕的跡象。 可能是誤解,因為只在UI線程上調用它才有意義,但為什么在UI線程上已經Invoke了?! 看起來像是一個矛盾。

lstStatus.Refresh(); 也是一種誤解,可能是迷信。 控制自動刷新(如果允許事件處理)。

使用invoke時,會在隊列中添加一條語句以供UI線程處理。

使用此簡單解決方案:

private void Library_StatusChanged(object sender, AbstractTestCase.StatusChangedEventArgs e)
{
    this.lblProgress.Invoke((MethodInvoker)delegate ()
    {
        lblProgress.Text = "Current state: " + e.Step;
    });

    this.pbProgess.Invoke((MethodInvoker)delegate ()
    {
        pbProgess.Value = e.Percentage;
    });

    this.lstStatus.Invoke((MethodInvoker)delegate ()
    {
        lstStatus.Items.Add("    " + e.Step);
    });
}

暫無
暫無

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

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