所以我需要更新我的WPF UI,这里是相同的代码。这是UI中的更新和元素。
commandPrompt
对象是使用此处提到的第三方UI库创建的:http://www.codeproject.com/Articles/247280/WPF-Command-Prompt。我正在测试这个UI模型。
它引发了以下例外:
调用线程无法访问此对象,因为它不同 线程拥有它。
private void CommandProcess(object sender, ConsoleReadLineEventArgs EventArgs)
{
string[] command = new string[EventArgs.Commands.Length];
for (int i = 0; i < EventArgs.Commands.Length; i++)
{
command[i] = EventArgs.Commands[i].ToLower();
}
if (command.Length > 0)
{
try
{
switch (command[0])
{
case "clear":
ProcessClear(command);
break;
case "demo":
ProcessParagraph(command);
break;
default:
new Task(() => { TextQuery(command); }).Start();
break;
}
}
catch (Exception ex)
{
WriteToConsole(new ConsoleWriteLineEventArgs("Console Error: \r" + ex.Message));
}
}
}
这是TextQuery方法。这使用RestSharp.dll
进行通信。
private void TextQuery(string[] command)
{
string APIQuery = ConvertStringArrayToString(command);
USBM usbm = new USBM("XXXXXX");
QueryResult results = usbm.Query(APIQuery);
if (results != null)
{
foreach (Pod pod in results.Pods)
{
Console.WriteLine(pod.Title);
if (pod.SubPods != null)
{
foreach (SubPod subPod in pod.SubPods)
{
EXCEPTION?? ====>WriteToConsole(new ConsoleWriteLineEventArgs("" + subPod.Title + "\n" + subPod.Plaintext));
}
}
}
}
}
这是用于写入同一个自定义控制台的函数。
private void WriteToConsole(ConsoleWriteLineEventArgs e)
{
commandPrompt.OnConsoleWriteEvent(this, e); <=======EXCEPTION HERE
}
如何让线程在它们之间共享数据?我谷歌它,但真的不能让我工作,因为我是异步编码的新手。
感谢。
答案 0 :(得分:2)
由于WriteToConsole
调用访问UI元素的commandPrompt
,因此应该在UI线程上进行调用。
由于您使用Task
,因此最终使用另一个线程来调用UI。这是不允许的,并且会给你错误。
您应该致电Dispatcher.Invoke
或BeginInvoke
在UI线程上进行调用:
Application.Current.Dispatcher.BeginInvoke
( new Action(() =>
WriteToConsole(new ConsoleWriteLineEventArgs(subPod.Title + "\n" + subPod.Plaintext)))
, DispatcherPriority.Background
);