我正在用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”});