以下代码来自我目前正在进行的开发证明:
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
...
QueueProcessor = new Task(() =>
{
while (processorrunning)
{
if (processorrunning && dq.Count != 0)
{
boxid = string.Empty;
if (dq.TryDequeue(out boxid))
{
if (textBox1.InvokeRequired)
{
textBox1.Invoke(new MethodInvoker(() =>
{
if (textBox1.Text == string.Empty)
textBox1.Text = boxid;
else
textBox1.Text += Environment.NewLine + boxid;
textBox1.Refresh();
}));
}
else
{
if (textBox1.Text == string.Empty)
textBox1.Text = boxid;
else
textBox1.Text += Environment.NewLine + boxid;
textBox1.Refresh();
}
}
else
{
throw new Exception("Exception removing boxid from queue.");
}
}
else
{
trigger.WaitOne(600000, false);
}
}
});
所有if条件都返回true。从dq.TryDequeue调用中有一个有效的boxid字符串分配给boxid。除了调用代码之外的所有内容都可以正常工作。代码永远不会在InvokeRequired测试中使用else。
Form1.textBox1永远不会看到任何东西。欢迎提示。