Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP SolidColorBrush—该应用程序调用了一个接口,该接口被封送用于不同的线程异常_C#_Multithreading_Xaml_Uwp - Fatal编程技术网

C# UWP SolidColorBrush—该应用程序调用了一个接口,该接口被封送用于不同的线程异常

C# UWP SolidColorBrush—该应用程序调用了一个接口,该接口被封送用于不同的线程异常,c#,multithreading,xaml,uwp,C#,Multithreading,Xaml,Uwp,我有一个UWP应用程序,它通过信号器接收动态更新。我使用的是Template10,信号侦听器位于ViewModel类中 当信号器接收到消息时,模型将更新。更新模型的代码块包装在Dispatcher方法中: VM-信号器调用的方法: private async void AddOrder(WorkOrder order) { await Windows.ApplicationModel.Core.CoreApplication.MainView.Dispatcher.Run

我有一个UWP应用程序,它通过信号器接收动态更新。我使用的是Template10,信号侦听器位于ViewModel类中

当信号器接收到消息时,模型将更新。更新模型的代码块包装在Dispatcher方法中:

VM-信号器调用的方法:

private async void AddOrder(WorkOrder order)
    {
        await Windows.ApplicationModel.Core.CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            order.Lines = new ObservableCollection<WorkOrderLine>(order.Lines.OrderByDescending(m => m.QtyScanned < m.Qty);
            this.Orders.Add(order);
        });
    }
GetForegroundColor如下所示:

private SolidColorBrush GetForegroundColour()
    {
        try
        {
            if (WorkOrderLineItems.Where(m => m.Status == UnitStatus.Other).Any())
            {
                return new SolidColorBrush(Colors.Red);
            }
            else if (WorkOrderLineItems.Where(m => m.Status == UnitStatus.AssemblyLine).Any())
            {
                return new SolidColorBrush(Colors.Green);
            }
            else if (WorkOrderLineItems.Where(m => m.Status == UnitStatus.PreLoad).Any())
            {
                return new SolidColorBrush(Colors.Black);
            }
            else if (WorkOrderLineItems.Where(m => m.Status == UnitStatus.FullAndComplete).Any())
            {
                return new SolidColorBrush(Colors.LightGray);
            }

            return new SolidColorBrush(Colors.Black);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"Exception in foreground colour: {ex.Message} {ex.StackTrace}");
            return null;
        }
    }
现在,在任何
新SolidColorBrush()
上都会引发wollowing异常:

The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
在最近的更改之前,我使用x:Bind中的Converter来完成GetForegroundColor方法正在做的工作(由于性能问题,我决定更改方法),它工作得很好。我还更新了一些其他的数据绑定属性,这些属性更新了UI(代码省略),这很好


任何想法都将不胜感激。这让我发疯。

您需要在主线程上运行模型的更改。 我在使用MVVM的UWP中遇到了同样的问题

我认为您需要用一个调度器包装事件的处理程序代码,以便在UI线程上运行它

private void TrolleyAllocations_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
      Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
      {
           RaisePropertyChanged("WorkOrderLineItems");
           ForegroundColor = GetForegroundColour();
      }
}

现在,您的处理程序被后台任务调用和激发,因此
GetForegroundColor()
位于同一个线程上。

您需要在UI线程中调用该方法(使用UWP时,我需要在Xamarin表单上执行同样的操作),感谢您的评论。这是我问题的根源:所以我正在更新包裹在Dispatcher调用中的模型,然后触发模型内部的CallCollectionChanged事件处理程序。是在不同线程上调用的CollectionChanged事件,因为对更新模型类的原始调用被军事化到UI线程上。
private void TrolleyAllocations_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
      Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
      {
           RaisePropertyChanged("WorkOrderLineItems");
           ForegroundColor = GetForegroundColour();
      }
}