由于单独的线程所有权,调用线程无法访问对象

时间:2015-04-20 10:13:35

标签: c# wpf multithreading asynchronous

所以我需要更新我的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
}

如何让线程在它们之间共享数据?我谷歌它,但真的不能让我工作,因为我是异步编码的新手。

感谢。

1 个答案:

答案 0 :(得分:2)

由于WriteToConsole调用访问UI元素的commandPrompt,因此应该在UI线程上进行调用。

由于您使用Task,因此最终使用另一个线程来调用UI。这是不允许的,并且会给你错误。

您应该致电Dispatcher.InvokeBeginInvoke在UI线程上进行调用:

Application.Current.Dispatcher.BeginInvoke
( new Action(() => 
      WriteToConsole(new ConsoleWriteLineEventArgs(subPod.Title + "\n" + subPod.Plaintext)))
, DispatcherPriority.Background
);