异步转同步问题
大家好,
我们在wp8开发过程中遇到异步转同步问题如下:
1.在C++组件中希望通过委托来调用C#层的函数实现,但是C#层的函数使用了大量的异步操作(async,await关键字),而需要设置到C++组件的委托函数不能是异步操作,所以需要将异步转同步处理,使用如下函数处理:
/// <summary>
/// 异步转同步
/// </summary>
/// <param name="func"></param>
public static void AsyncRun(Func<Task> func)
{
//func为空 不执行
if (func == null)
{
return;
}
Task.Run(async () =>
{
await func.Invoke();
}).Wait();
}
2.由于AsyncRun方法在非UI线程中处理,如果func方法中有对UI的操作,则程序奔溃。那么又需要通过System.Windows.Deployment.Current.Dispatcher.BeginInvoke将func方法强制设置到UI线程中处理,使用如下函数处理:
/// <summary>
/// 异步转同步
/// </summary>
/// <param name="func"></param>
public static void AsyncRun(Func<Task> func)
{
//func为空 不执行
if (func == null)
{
return;
}
Task.Run(async () =>
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(async () =>
{
if (func != null)
{
await func.Invoke();
}
});
}).Wait();
}
3.但是BeginInvoke执行的是异步处理,这样处理下来,又无法达到同步处理的效果,后续又做了如下改动
/// <summary>
/// 异步转同步
/// </summary>
/// <param name="func"></param>
public static void AsyncRun(Func<Task> func)
{
//func为空 不执行
if (func == null)
{
return;
}
EventWaitHandle Wait = new AutoResetEvent(false);
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(async () =>
{
try
{
await func.Invoke();
}
catch (System.Exception ex)
{
}
Wait.Set();
});
// wait while func.Invoke() on UI
Wait.WaitOne();
}
在非UI线程下,运行是正常的,但在UI线程,AsyncRun方法会出现死循环(因为EventWaitHandle阻塞了UI线程)。
在实际项目中,遇到情况比较复杂,可能是UI线程操作,也可能是非UI。目前不知道在UI线程下,怎么实现同步操作。
附示例代码
https://skydrive.live.com/redir?resid=82F5E40F919E82BF!144&authkey=!AJ1OGBJKQewVvNk
附件为简单的实例代码,请问,怎么实现UI线程下的同步操作呢?或者有什么好的处理方案吗?
谢谢。