使用参数调用方法



我正在用C#和.NET Framework 4.0开发一个Windows窗体应用程序。

我使用Task来运行一个长时间运行的任务,每次任务处理代码时,我都需要用一些日志消息更新UI。

有一个队列正在处理该代码,我需要显示一个代码已经被处理。

private Task taskReadCodeAuto;
private delegate void RefreshTextBox();
private Queue CodesReceived;

public MainForm()
{
    InitializeComponent();
    logMessages = new List<string>();
    CodesReceived = new Queue();
    taskReadCodeAuto = new Task(() => ProcessCodesReceived());
}
private void ProcessCodesReceived()
{
    int result;
    try
    {
        while (CodesReceived.Count > 0)
        {
            string code = CodesReceived.Dequeue().ToString();
            InsertProfileMessage(DateTime.Now.ToString("HH:mm:ss.fff"), string.Format("Sending code {0} to ReadCodeAuto...", code));
            if (trzic == null)
            {
                result =
                    TRZIC.ReadCodeAuto(
                        ConnStringTextBox.Text,
                        byte.Parse(AggregationNumeric.Value.ToString()),
                        code);
            }
            else
            {
                result =
                    trzic.ReadCodeAuto(
                        byte.Parse(AggregationNumeric.Value.ToString()),
                        code);
            }
            InsertProfileMessage(DateTime.Now.ToString("HH:mm:ss.fff"), string.Format("Code sent {0}. Result: {1}", code, result));
        }
    }
    catch (Exception ex)
    {
        InsertProfileMessage(DateTime.Now.ToString("HH:mm:ss.fff"), "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        InsertProfileMessage(DateTime.Now.ToString("HH:mm:ss.fff"), "Error: " + ex.Message);
        InsertProfileMessage(DateTime.Now.ToString("HH:mm:ss.fff"), "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }
    finally
    {
        InsertProfileMessage(DateTime.Now.ToString("HH:mm:ss.fff"), "END BG-WORKER");
    }
}
private void InsertProfileMessage(string time, string message)
{
    string profileString =
            string.Format("{0} - {1}", time, message);
    logMessages.Add(profileString);
    if (this.InvokeRequired)
    {
        RefreshTextBox d = new RefreshTextBox(RefreshTextBoxResults);
        Invoke(d);
    }
    else
    {
        RefreshTextBoxResults(profileString + "n");
    }
}
private void RefreshTextBoxResults(string text)
{
    LogTextBox.AppendText(text);
}

我的问题是,我不知道如何使用Invoke传递文本以显示在LogTextBox上。

我该怎么做

使用Invoke的重载,该重载将Object[]作为要提供给方法的参数的参数。

您可以在调用后添加参数:

        Action<string> d = RefreshTextBoxResults;
        this.Invoke(d, profileString + "n");

或者在已经包含参数的情况下调用操作(在这种情况下,适用于可重用性)

Action d= () =>RefreshTextBoxResults(profileString + "n");
if (this.InvokeRequired)
{
    Invoke(d);
}
else
{
    d();   
}

PS,如果您想使用RefreshTextBox委托而不是Action,则RefreshTextBox委托应更改为包含字符串参数

您必须使用Invoke的重载,该重载使用数组:

MSDN文档

如下所示传递文本值。

RefreshTextBox d = new RefreshTextBox(RefreshTextBoxResults);
Invoke(d,new object[] {“Pass value here”});

相关内容

  • 没有找到相关文章

最新更新