尝试在Windows Phone上显示来自相机胶卷的图像时出现交叉线程异常

时间:2014-08-13 14:25:49

标签: c# multithreading windows-phone-8 xamarin.ios xamarin

我正在使用Xamarin在便携式类库中构建Windows手机应用程序。我从Windows Phone相机胶卷获得了图像,我将List传回PCL,并在我的视图中将图像分配给ImageSource。

Windows Phone获取图片

foreach (var image in CameraRollPictures)
{
    Image img = new Image();
    img.Source = ImageSource.FromStream(() => image.GetImage());
    images.Add(img);
}           
return images;

PCL方法:

    private RelayCommand _importPhoto;
    public RelayCommand ImportPhoto
    {
        get
        {
            return _importPhoto
                ?? (_importPhoto = new RelayCommand(
                                      () =>
                                      {
                                          IOperations op = DependencyService.Get<IOperations>();                                            
                                          Task<List<Image>> t = new Task<List<Image>>(() =>
                                          {
                                              return op.ImportPhoto();

                                          });
                                          t.ContinueWith((sender) =>
                                              {
                                                  PageOp.Navigate(new TaggingPage());
                                                  if (sender.Result.Count != 0)
                                                  {
                                                      try
                                                      {
                                                          App.Locator.TaggingPageVM.ImageSrc = sender.Result[0].Source;
                                                      }
                                                      catch (Exception ex)
                                                      {

                                                      }
                                                  }
                                              }, TaskScheduler.FromCurrentSynchronizationContext());
                                          t.Start();
                                      }));

查看:

<Image Source="{Binding ImageSrc}"/>

例外:

  

{System.UnauthorizedAccessException:无效的跨线程访问。
  在MS.Internal.XcpImports.CheckThread()at   System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex,IntPtr   constructDO)在System.Windows.Media.Imaging.BitmapImage..ctor()
  在   Xamarin.Forms.Platform.WinPhone.StreamImagesourceHandler.d__0.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()   在   Xamarin.Forms.Platform.WinPhone.ImageRenderer.d__0.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__3(对象   状态)}

更新

如果我从资源加载图片,那么它可以正常工作。

App.Locator.TaggingPageVM.ImageSrc = ImageSource.FromFile("50175950-tulips-microsofts.jpg");

对于在Windows手机上创建的图像并将这些图像传回我的PCL一定是错误的

1 个答案:

答案 0 :(得分:1)

我正在使用Xamarin:

Device.BeginInvokeOnMainThread(() => { App.Locator.TaggingPageVM.ImageSrc = sender.Result[0].Source; }); 

修正了跨线程错误