我创建了一个创建线程的程序,并在该线程中创建了图像:
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行“
我需要做什么?
答案 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);
}
我没有通过编译测试上面的内容,但它应该给你一个良好的开端。如果您有疑问,请告诉我。