1

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

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 at TestVideo.MainPage.SetImageFromStream() in ...\MainPage.xaml.cs:line 500\r\n at TestVideo.MainPage.SavePhoto1() in ....\MainPage .xaml.cs:第 145 行"

我需要做什么?

4

1 回答 1

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在上述方法中返回 a 。编译器会自动为您执行此操作。

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

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);
}

我没有通过编译来测试上面的内容,但它应该会给你一个好的开始。如果您有任何问题,请告诉我。

于 2013-03-26T17:23:58.747 回答