代码之家  ›  专栏  ›  技术社区  ›  Jeff

为什么这个任务等待离开Xamarin iOS中的UI上下文?

  •  0
  • Jeff  · 技术社区  · 6 年前

    下面的内容多少动摇了我基于异步/等待的信念体系。在Xamarin/iOS下,以下操作失败,表示UI相关的事情是在非UI线程中完成的。添加检查点表明,在异步文件写入之后,上下文实际上确实发生了切换。

    同样的代码在Android和UWP上运行良好。

    private async void ShareButton_OnClicked(object sender, EventArgs e)
    {
        if (!(BindingContext is PhotoViewModel photoViewModel))
        {
            return;
        }
    
        // in UI context
    
        var name = photoViewModel.Name ?? "temp.jpg";
        var file = Path.Combine(FileSystem.CacheDirectory, name);
    
        using (var stream = new FileStream(file, FileMode.Create, FileAccess.Write))
        {
            await stream.WriteAsync(photoViewModel.Data, 0, photoViewModel.Data.Length);
        }
    
        // not in UI context!
    
        // calling this causes SIGABRT: UIKit Consistency error
        await Share.RequestAsync(new ShareFileRequest(new ShareFile(file)));
    }
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Junior Jiang    6 年前

    调用此函数会导致SIGABRT:UIKit一致性错误

    await Share.RequestAsync(new ShareFileRequest(new ShareFile(file)));
    

    虽然Android和UWP没有问题,但它可能与iOS中的这种编写不兼容。上面的代码需要UI线程来调用,但是它在 async 方法 ShareButton_OnClicked

    await Device.InvokeOnMainThreadAsync(() =>
    {
        // inkoke your code .
        Share.RequestAsync(new ShareFileRequest(new ShareFile(file)));
    });
    
        2
  •  0
  •   Jeff    6 年前

    原来这是单声道的一个错误

    https://github.com/mono/mono/issues/16759