我有一个大问题,希望你们能帮助我......
我需要开始一个名为Thread
的{{1}},到目前为止没问题。
ListenOnSocket
但是当我想在Thread ListenOnSocket = new Thread(newThreadStart(Form1.ListenOnSocket));
ListenOnSocket.Start();
内更改标签时,我会得到非静态字段,方法或属性的对象引用。
通常情况下,你会通过这样做来传递标签
ListenOnSocket
然后我得到了
ListenOnSocket没有重载匹配委托System.Threading.Threadstart 在我的开头。
任何人都可以请求帮助,我真的被困了,对不起,如果没有太多可以继续我对C#很新。
答案 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这是一个帮助程序旨在帮助长时间运行后台任务的课程。