在引发所有事件(或组合事件)后,C#做一些工作

在引发所有事件(或组合事件)后,C#做一些工作,第1张

概述我想订阅在引发所有其他多个事件时将引发的事件. 假设我有多个任务(A)要先做(例如动画多个独立视图),我也可以订阅任务完成的事件,并且我想在所有这些之后做一些其他工作(B)事件结束了. 第一个任务(A)的数量每次都可以不同,所以此刻我设置一个计数器到任务数量A,订阅N个事件,并在事件处理程序中完成任务,我减少计数器,当它为零时,我做任务B. 结合这些事件比使用计数器有更好的方法吗? 如果我正确理解 我想订阅在引发所有其他多个事件时将引发的事件.

假设我有多个任务(A)要先做(例如动画多个独立视图),我也可以订阅任务完成的事件,并且我想在所有这些之后做一些其他工作(B)事件结束了.

第一个任务(A)的数量每次都可以不同,所以此刻我设置一个计数器到任务数量A,订阅N个事件,并在事件处理程序中完成任务,我减少计数器,当它为零时,我做任务B.

结合这些事件比使用计数器有更好的方法吗?

解决方法 如果我正确理解了这个问题,那么当你启动A任务时增加一个计数器,当每个任务完成时,你会减少事件处理程序中的计数器.同样在事件处理程序中,如果计数器为零,则检查(在递减计数器之后).如果是这样,你做任务B.

我建议你看一下Tasks(又名“任务并行库(TPL)”),它允许你做这样的事情:

Task.WhenAll( new Task[] {    Task.Run(()=> { //... do work A1... },Task.Run(()=> { //... do work A2... },Task.Run(()=> { //... do work A3... }})    .ContinueWith(()=> {//... do work B... });

更新:根据您在下面的评论中提到的WPF动画,Task.Run可能不适合这里.如果我没记错的话,你会得到一个已完成的事件,并且没有办法在代码中同步运行动画(如“……做工作A1 ……”).

但是,您可以通过以下扩展方法从Storyboard的Completed事件创建任务,而不是通过Task.Run创建任务:

public static Task<Storyboard> BeginAsync(this Storyboard sb){   var tcs = new taskcompletionsource<Storyboard>();   sb.Completed += (s,a) => tcs.TrySetResult(sb);   sb.Begin();   return tcs.Task;}

请注意,此方法创建一个在故事板的Completed事件处理程序中完成的任务,并在返回任务之前开始故事板动画.另请注意,您可以为其他类型和事件编写类似的扩展方法.

您可以使用此方法,例如:

var sb1 = (Storyboard)mainWindow.FindResource("Storyboard1");var sb2 = (Storyboard)mainWindow.FindResource("Storyboard2");var sb3 = (Storyboard)mainWindow.FindResource("Storyboard3");Task.WhenAll( new Task[] {    sb1.BeginAsync(),sb2.BeginAsync(),sb3.BeginAsync() })    .ContinueWith(() => MessageBox.Show("All done!"),TaskScheduler.FromCurrentSynchronizationContext());

TaskScheduler.FromCurrentSynchronizationContext()基本上调度继续任务以在UI线程上运行(如果您将访问UI元素,则需要这样做).

总结

以上是内存溢出为你收集整理的在引发所有事件(或组合事件)后,C#做一些工作全部内容,希望文章能够帮你解决在引发所有事件(或组合事件)后,C#做一些工作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存