C# 使用参数调用委托方法名称
尝试在后台运行C# 使用参数调用委托方法名称,c#,multithreading,winforms,C#,Multithreading,Winforms,尝试在后台运行BackgroundWorker的设置,然后在完成每个步骤时在单独的模式对话框中更新其进度。当然,问题是试图从BackgroundWorker线程更新进度对话框会导致跨线程问题 代码:(有问题的行的注释周围有***) 下面是进度对话框的代码: public partial class ProgressDialog : Form { public string Message { get { return lbl
BackgroundWorker
的设置,然后在完成每个步骤时在单独的模式对话框中更新其进度。当然,问题是试图从BackgroundWorker
线程更新进度对话框会导致跨线程问题
代码:(有问题的行的注释周围有***
)
下面是进度对话框的代码:
public partial class ProgressDialog : Form
{
public string Message
{
get
{
return lblMessage.Text;
}
set
{
if(lblMessage.InvokeRequired)
{
// *** not sure how to invoke this by passing the "value" parameter ***
// *** returns a TargetParameterCountException ***
// *** trying to pass "value" in results in "Method name expected" error ***
lblMessage.Invoke(new UpdateMessageDelegate(SetMessage));
}
}
}
private delegate void UpdateMessageDelegate(string s);
private void SetMessage(string s)
{
lblMessage.Text = s;
}
}
如何使用标签的
set
方法和隐式value
参数安全地更改标签的文本值?尝试以下方式调用:
lblMessage.Invoke((Action)(() => SetMessage(value)));
然后,您还可以避免创建私有的
UpdateMessageDelegate
委托。尝试这样调用它:
lblMessage.Invoke((Action)(() => SetMessage(value)));
然后,您还可以避免创建私有的
UpdateMessageDelegate
委托。刚刚找到了一种方法:
public string Message
{
get
{
return lblMessage.Text;
}
set
{
if(lblMessage.InvokeRequired)
{
lblMessage.Invoke(new UpdateMessageDelegate(SetMessage), value);
}
}
}
只是找到了一种方法:
public string Message
{
get
{
return lblMessage.Text;
}
set
{
if(lblMessage.InvokeRequired)
{
lblMessage.Invoke(new UpdateMessageDelegate(SetMessage), value);
}
}
}
啊,那可以,谢谢。我还找到了另一种方法,这将在一分钟内回答这个问题。啊,那可能有效,谢谢。我还找到了另一种方法,这将在一分钟内回答这个问题。