簡體   English   中英

更改標簽文本並在同一空隙中啟動線程

[英]Change label text and start threads in the same void

我有一個大問題,希望你們能幫助我...

我需要啟動一個名為ListenOnSocketThread ,到目前為止沒有問題。

Thread ListenOnSocket = new Thread(newThreadStart(Form1.ListenOnSocket));
ListenOnSocket.Start();

但是,當我想從ListenOnSocket更改標簽時,我得到了非靜態字段,方法或屬性的對象引用。

所以通常您會通過這樣做來傳遞標簽

 public static void ListenOnSocket(Label lblstatus)
 {
     //i want to change the label from here.
     lblstatus.text = "Hello";
 }

但后來我明白了

ListenOnSocket沒有重載匹配我的threadstart中的委托System.Threading.Threadstart。

誰能幫忙,我真的很受困擾,如果沒有太多事情要做,對不起,我是C#的新手。

您可以使用Lambda表達式傳遞參數。

Thread ListenOnSocket = new Thread( () => { Form1.ListenOnSocket(yourParameter); } );
ListenOnSocket.Start();

但是,當執行ListenOnSocket方法時,您將獲得CrossThreadException 因此,您需要使用BeginInvoke設置標簽文本。

因此,搜索CrossThreadException以及為什么會得到它。

注意:我不為此編寫示例代碼,因為搜索更有利。

您需要將其編組回UI線程:

public static void ListenOnSocket(Label lblstatus)
{
    this.BeginInvoke(new Action(() => 
    {
        //i want to change the label from here.
        lblstatus.text = "Hello";
    });
}

看來您實際上可能在這里需要ParameterizedThreadStart。 您將傳遞Label作為其參數。 還需要在UI線程上執行控件更改。

    public void DoSomething()
    {
        // Actually a ParameterizedThreadStart, but you don't need to state this explicitly
        //var listenOnSocket = new Thread(new ParameterizedThreadStart(ListenOnSocket));
        var listenOnSocket = new Thread(ListenOnSocket);

        // Pass the label as the ParameterizedThreadStart parameter
        // TestLabel is a label within the form
        listenOnSocket.Start(TestLabel);
    }

    private void ListenOnSocket(object statusLabelObject) // Parameter must be of type Object
    {
        var statusLabel = statusLabelObject as Label;
        if (statusLabel == null)
            throw new ArgumentException(@"Parameter must be of type Label", "statusLabelObject");

        // Changes to controls must be performed on the UI thread.
        BeginInvoke((Action)(() => statusLabel.Text = @"text"));
    }

他們在這里的關鍵在於,從后台線程更新UI元素(如標簽)是無效的。

如果您的任務運行時間較長,則可能不想在UI線程上運行該任務,因為它將阻塞。

假設您正在創建線程是因為您的某個東西在UI線程上運行的時間過長,可能值得研究將后台線程對UI線程的調用編組的方式。

有關如何執行此操作的更多信息,請參見如何從C#中的另一個線程更新GUI? 如果要從長時間運行的任務中更新狀態,則可能需要調查后台工作程序: MSDN:如何使用后台工作程序 ,這是一個旨在幫助長時間運行的后台任務的幫助程序類。

暫無
暫無

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

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