更改标签文本并在相同的void中启动线程

时间:2015-03-31 18:15:40

标签: c# multithreading visual-studio-2013

我有一个大问题,希望你们能帮助我......

我需要开始一个名为Thread的{​​{1}},到目前为止没问题。

ListenOnSocket

但是当我想在Thread ListenOnSocket = new Thread(newThreadStart(Form1.ListenOnSocket)); ListenOnSocket.Start(); 内更改标签时,我会得到非静态字段,方法或属性的对象引用。

通常情况下,你会通过这样做来传递标签

ListenOnSocket

然后我得到了

  

ListenOnSocket没有重载匹配委托System.Threading.Threadstart   在我的开头。

任何人都可以请求帮助,我真的被困了,对不起,如果没有太多可以继续我对C#很新。

4 个答案:

答案 0 :(得分:1)

您可以使用Lambda Expression传递参数。

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

但是当CrossThreadException方法执行时,您将获得ListenOnSocket。因此,您需要使用BeginInvoke来设置标签文字。

所以请搜索CrossThreadException以及为什么会得到它。

注意:我没有为此编写示例代码,因为搜索更有用。

答案 1 :(得分:0)

您需要将其封送回UI线程:

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

答案 2 :(得分:0)

看起来你可能真的想要一个ParameterizedThreadStart。 您可以将Label in作为参数传递。 还需要在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"));
    }

答案 3 :(得分:0)

它们的关键问题是从后台线程更新UI元素(如标签)无效。

如果你有一个长时间运行的任务,那么你可能不希望在UI线程上运行它,因为它会阻止。

假设您正在创建一个线程,因为您运行的时间太长而无法在UI线程上运行,那么可能需要研究将后台线程调用编组到UI线程的方式。

有关如何执行此操作的详细信息,请参阅How to update the GUI from another thread in C#?如果您要从长时间运行的任务更新状态,您可能需要查看后台工作程序:MSDN: How to Use Background Worker这是一个帮助程序旨在帮助长时间运行后台任务的课程。