c#winrt错误0x8001010E

时间:2013-03-26 16:22:13

标签: c# windows-runtime

我创建了一个创建线程的程序,并在该线程中创建了图像:

private async void GetCamera()
{
   ....
    tk = new Task(MyAwesomeTask);
    tk.Start();

}

private async void MyAwesomeTask()
{
        while (true)
        {
            await Task.Delay(TimeSpan.FromSeconds(0.5));
            SavePhoto1();
        }
}

private  void SavePhoto1()
{
        try
        {
            WriteableBitmap wb1 = new WriteableBitmap(320, 240);//throw exception
        }catch (Exception ee)
        {
            String s = ee.ToString();
        }

}

但行

WriteableBitmap wb1 = new WriteableBitmap(320, 240); 

抛出异常:

  

s =“System.Exception:应用程序调用了为不同线程编组的接口。(来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))\ r \ n在Windows.UI.Xaml.Media.Imaging.WriteableBitmap中。 .ctor(Int32 pixelWidth,Int32 pixelHeight)\ r \ n在TestVideo.MainPage.SetImageFromStream()in ... \ MainPage.xaml.cs:line 500 \ r \ n在TestVideo.MainPage.SavePhoto1()in ... 。\ MainPage.xaml.cs:第145行“

我需要做什么?

1 个答案:

答案 0 :(得分:4)

第一个问题是您使用async void。您应该这样做的唯一时间是该方法是一个事件处理程序。在您的情况下,您应该使用async Task代替:

private async Task GetCamera()
{
   ....
    //tk = new Task(MyAwesomeTask);
    //tk.Start();
    await Task.Run(async () => await MyAwesomeTask());
    ...    
}

private async Task MyAwesomeTask()
{
    while (true)
    {
        await Task.Delay(TimeSpan.FromSeconds(0.5));
        // added await
        await SavePhoto1();
    }
}

您实际上不需要在上述方法中返回Task。编译器会自动为您完成。

要解决您的问题,您应该只在UI线程上创建WriteableBitmap个对象。你可以这样做:

private async Task SavePhoto1()
{
    try
    {
        WriteableBitmap wb1 = null;
        await ExecuteOnUIThread(() =>
        {
            wb1 = new WriteableBitmap(320, 240);//throw exception
        });

        // do something with wb1 here
        wb1.DoSomething();
    }catch (Exception ee)
    {
        String s = ee.ToString();
    }
}    

public static IAsyncAction ExecuteOnUIThread(Windows.UI.Core.DispatchedHandler action)
{
    return Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, action);
}

我没有通过编译测试上面的内容,但它应该给你一个良好的开端。如果您有疑问,请告诉我。