如何同步使用CoreDispatcher.RunAsync

tmp00000 UID.995403
2015-11-22 发表

我最近正在编写使用win2d的程序。在处理CanvasAnimatedControl的Draw事件时需要向UI线程回调获取一些DependencyProperty的值然后再根据获取到的信息绘制。在WPF项目中遇到类似的情况时调用Dispatcher.Invoke就能解决问题,但是在UWP项目只有RunAsync。RunAsync返回的IAsyncOperation或者是它转换来的Task不那么好处理。用await是不行的,因为任务返回的时候已经该画下一帧了,这一帧的资源已经释放。用Wait也不行,因为这有时候会死锁,有时候正常运行,非常不稳定。不处理返回的Task也不行,因为获取的值后面要用。需要获取的值定义到类里面也不行,因为获取到的数据需要实时更新。

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
ze****sl UID.1015033
2015-11-22 回复

http://stackoverflow.com/questions/5095183/how-would-i-run-an-async-taskt-method-synchronously
希望能帮上忙

tmp00000 UID.995403
2015-11-22 回复

Quotezerowsl 发表于 2015-11-22 20:05
http://stackoverflow.com/questions/5095183/how-would-i-run-an-async-taskt-method-synchronously
希望 ...


那些评论跟我一起陷入同样的困境。解决问题的人几乎都避免将Task同步使用,但是我这种情况只能同步。一旦异步就会让这个事件在没有处理完的时候原本参数中可用的资源(例如args.DrawingSession)被意外释放掉。

tmp00000 UID.995403
2015-11-22 回复

Quotezerowsl 发表于 2015-11-22 20:05
http://stackoverflow.com/questions/5095183/how-would-i-run-an-async-taskt-method-synchronously
希望 ...


强制同步运行又会引发随机的死锁。在切换页面后切换回来时更容易死锁。

h82****652 UID.880817
2015-11-23 回复

将绘制中需要用到的数据用字段、属性存放起来。
Draw方法里是必须完全同步的。

可以参考我博客里如何处理
***链接停止解析***

tmp00000 UID.995403
2015-11-24 回复

Quoteh82258652 发表于 2015-11-23 17:54
将绘制中需要用到的数据用字段、属性存放起来。
Draw方法里是必须完全同步的。


非得完全同步的话,浪费一下内存似乎能解决问题。Draw事件处理时用到的DependencyProperty注册更改值时的回调,在回调中改变临时字段的内容,最后在Draw事件用临时字段。

qiqiminmin UID.638527
2015-11-26 回复

本帖最后由 qiqiminmin 于 2015-11-26 01:11 编辑

首先我想知道你的程序是什么目的,因为也看不到程序,如果是用RunAsync我这到有例子.

如果只是CanvasAnimatedControl之类的,你自己写个StoryBoard都可以解决UI显示问题。我这里提到的不是在xaml里,
就在C#里面,你可以把StoryBoard是个可以更新你UI的Timer.用起来非常棒。

[mw_shl_code=csharp,true]public class DispatchToUIThread : INotifyCompletion
{
private readonly CoreDispatcher dispatcher;

public static DispatchToUIThread Awaiter { get; private set; }

private DispatchToUIThread(CoreDispatcher dispatcher)
{
this.dispatcher = dispatcher;
}

[CLSCompliant(false)]
public static void Initialize(CoreDispatcher dispatcher)
{
if (dispatcher == null) throw new ArgumentNullException("dispatcher");
Awaiter = new DispatchToUIThread(dispatcher);
}

public DispatchToUIThread GetAwaiter()
{
return this;
}

public bool IsCompleted
{
get { return this.dispatcher.HasThreadAccess; }
}

public async void OnCompleted(Action continuation)
{
if (continuation == null) throw new ArgumentNullException("continuation");
await this.dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => continuation());
}

public void GetResult() { }
}[/mw_shl_code]

tmp00000 UID.995403
2015-11-26 回复

Quoteqiqiminmin 发表于 2015-11-26 00:20
首先我想知道你的程序是什么目的,因为也看不到程序,如果是用RunAsync我这到有例子.

如果只是CanvasAnima ...


我需要使用一些只在Win2d和WPF存在的特效,比如错位,模糊,自定义着色器特效。只用xaml是不行的。win2d的Draw事件的处理方法必须是同步的,异步回调UI线程这条路似乎走不通。

qiqiminmin UID.638527
2015-11-26 回复

本帖最后由 qiqiminmin 于 2015-11-26 22:52 编辑

Quote***链接停止解析***
我需要使用一些只在Win2d和WPF存在的特效,比如错位,模糊,自定义着色器特效。只用xaml是不行的。win2d ...


错位,模糊,自定义这些东西,如果是运用于uwp应用上,win2d是最好别用。
win2d是基于位图的,你需要导入资源的。做简单2d游戏,图像处理可以用的,不过monogame各方面又比win2d要好很多。

给你看个链接,就知道如今的应用开发时发展很快的。ios,android,html5都在飞速前进,错位,模糊等,是属于基本功的,xaml连个矢量图都是废的,还只能用canvas将就。
***链接停止解析***

tmp00000 UID.995403
2015-11-27 使用 Lumia 1520 回复

Quoteqiqiminmin 发表于 2015-11-26 22:50
错位,模糊,自定义这些东西,如果是运用于uwp应用上,win2d是最好别用。
win2d是基于位图的,你需要导入 ...


我正在移植一个代码量过万的WPF应用到uwp(1万多行vb代码,一堆xaml文件和少于2000行的c++代码),更换开发语言会让我的工作量倍增。内存使用问题我知道如何权衡。而且我的应用不止加特效那么简单。某些地方甚至要根据InkCanvas收集的墨迹对某种字体的轮廓进行修改然后逐字渲染。

tmp00000 UID.995403
2015-11-27 使用 Lumia 1520 回复

Quoteqiqiminmin 发表于 2015-11-26 22:50
错位,模糊,自定义这些东西,如果是运用于uwp应用上,win2d是最好别用。
win2d是基于位图的,你需要导入 ...


还有,你给的链接我用手机打不开

tmp00000 UID.995403
2015-11-27 使用 Lumia 1520 回复

Quoteqiqiminmin 发表于 2015-11-26 22:50
错位,模糊,自定义这些东西,如果是运用于uwp应用上,win2d是最好别用。
win2d是基于位图的,你需要导入 ...


我现在看到安卓就头疼,原因是自己的软件7天内出现加了各种恶心恶意插件的山寨版。太可怕了!!

qiqiminmin UID.638527
2015-11-29 回复

Quote***链接停止解析***
我正在移植一个代码量过万的WPF应用到uwp(1万多行vb代码,一堆xaml文件和少于2000行的c++代码),更换开 ...


凭空在uwp上创造一些wpf应用所需的环境,本身就不容易了,可能比你之前的wpf应用还要难。

( ̄▽ ̄)"。。。。。。。

tmp00000 UID.995403
2015-11-29 回复

本帖最后由 tmp00000 于 2015-11-29 23:35 编辑

Quoteqiqiminmin 发表于 2015-11-29 04:11
凭空在uwp上创造一些wpf应用所需的环境,本身就不容易了,可能比你之前的wpf应用还要难。

( ̄▽ ̄)“。。 ...


现在移植还算顺利。c++代码移植完了,vb和hlsl在进行。移植过程中我还给它添加了新功能,并删掉了由于权限而不能移植的功能。
同步运行的那个问题我通过建立临时变量和使用原子操作解决了。直接避免使用RunAsync

qiqiminmin UID.638527
2015-11-30 回复

Quote***链接停止解析***
现在移植还算顺利。c++代码移植完了,vb和hlsl在进行。移植过程中我还给它添加了新功能,并删掉了由于权 ...


什么软件? 图像处理?{:5_197:} 。

tmp00000 UID.995403
2015-11-30 回复

Quoteqiqiminmin 发表于 2015-11-30 06:21
什么软件? 图像处理? 。


这个软件能初步模仿一种人的书写习惯,在计算笔迹时播放主要由GPU运算的动画。我正在改进算法让它能适应更多人的书写习惯。具体细节不便透露,毕竟是我的大学生创新项目,有些东西得低调点。

重头儿再来 UID.356529
2015-11-30 回复

Quote***链接停止解析***
什么软件? 图像处理? 。


我正在做一个UWP的图像处理软件,有什么建议吗?

tmp00000 UID.995403
2015-11-30 回复

Quote重头儿再来 发表于 2015-11-30 17:00
我正在做一个UWP的图像处理软件,有什么建议吗?


让我猜猜,他可能会建议你用html5完成某些工作。至少那样你不用担心内存泄漏和内置资源太少之类的问题。

qiqiminmin UID.638527
2015-11-30 回复

本帖最后由 qiqiminmin 于 2015-11-30 19:58 编辑

Quote***链接停止解析***
让我猜猜,他可能会建议你用html5完成某些工作。至少那样你不用担心内存泄漏和内置资源太少之类的问题。 ...


( ̄▽ ̄)",我不会建议用html5做图像处理,不过现在很多人这么做,还做得很不错.

一般做图像处理都是在学生阶段,毕业了都不会弄那东西的。我以前都是用 Opencv 或者 aforge.

qiqiminmin UID.638527
2015-11-30 回复

Quote***链接停止解析***
我正在做一个UWP的图像处理软件,有什么建议吗?


是写文章还是发布应用呢?

( ̄▽ ̄)",我只是读书的时候弄图像处理,现在可能给不了建议了。

重头儿再来 UID.356529
2015-11-30 回复

Quote***链接停止解析***
让我猜猜,他可能会建议你用html5完成某些工作。至少那样你不用担心内存泄漏和内置资源太少之类的问题。 ...


哈哈,这倒也算个可行的建议

重头儿再来 UID.356529
2015-11-30 回复

本帖最后由 重头儿再来 于 2015-11-30 20:37 编辑

Quote***链接停止解析***
是写文章还是发布应用呢?

( ̄▽ ̄)",我只是读书的时候弄图像处理,现在可能给不了建议了。 ...


当然是应用,尽管这类应用不少了,可还是想自己做一个。
如果不介意,能说一下您现在做着哪方面的软件开发吗?

qiqiminmin UID.638527
2015-11-30 回复

本帖最后由 qiqiminmin 于 2015-11-30 22:54 编辑

Quote***链接停止解析***
当然是应用,尽管这类应用不少了,可还是想自己做一个。
如果不介意,能说一下您现在做着哪方面的软件开 ...


我一般做教育和健身的。。。。。 这两个软件用户还愿意花钱。我现在的其实很简答,多向html5靠拢。没其他的了。我感兴趣的是UI方面,应用我一般只考虑两部分, 数据+UI,

wp****li UID.1018008
2017-09-08 回复

用 ThreadPool的RunAsync,即:dispatcher.RunAsync 不要用coredispatcher
为从 UI 线程中分拆辅助线程,请不要使用此方法 (CoreDispatcher::RunAsync)。代之以的是,使用 Windows::System::Threading::ThreadPool::RunAsync 方法之一重载。
详见:https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.ui.core.coredispatcher.runasync.aspx

tmp00000 UID.995403
2017-09-08 回复

Quotewp-Ali 发表于 2017-9-8 20:03
用 ThreadPool的RunAsync,即:dispatcher.RunAsync 不要用coredispatcher
为从 UI 线程中分拆辅助线程, ...


请勿挖坟。现在 UWP 在特效有 Composition API,已经不再需要频繁使用 Win2D。

artfly08 UID.2900999
2018-06-26 使用 Lumia 950 XL 回复

开发者

artfly08 UID.2900999
2018-07-14 使用 Lumia 950 XL 回复

太专业,支持

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报