异步转同步问题

wszjdnssa 2013-06-18 01:47:17
大家好,
我们在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线程下的同步操作呢?或者有什么好的处理方案吗?

谢谢。
...全文
578 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wszjdnssa 2013-06-19
  • 打赏
  • 举报
回复
引用 1 楼 cuit 的回复:
在回调里写你的同步代码
什么意思???
gnimgnot 2013-06-18
  • 打赏
  • 举报
回复
在回调里写你的同步代码

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧