Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用参数调用委托方法名称_C#_Multithreading_Winforms - Fatal编程技术网

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);
        }
    }
}

啊,那可以,谢谢。我还找到了另一种方法,这将在一分钟内回答这个问题。啊,那可能有效,谢谢。我还找到了另一种方法,这将在一分钟内回答这个问题。