【问题标题】:Execute different actions in sync mode在同步模式下执行不同的操作
【发布时间】:2015-04-05 02:47:09
【问题描述】:

我想为动作管理创建一个帮助类。

假设我们有一组方法,例如:

void MyMethod(type1 param1, type2 param2, ..., Action finishedCallback);

我想创建一个以同步方式执行给定方法的类。

// var method1 is MyMethod1(int p1, string p2, c => {Console.WriteLine("m1 finished");})
// var method2 is MyMethod2(float p1, string p2, object p3, c => {Console.WriteLine("m2 finished");})
class Parameter
{
   public object Type {get; set;}
   public object Value {get; set;}
}

var actions = new List<Tuple<Action, List<Parameter>>>();
actions.Add(new Tuple<Action, List<Parameter>>(method1, m1Params));
actions.Add(new Tuple<Action, List<Parameter>>(method2, m2Params));

如何执行我的操作?

foreach (var action in actions)
{
   // ???
}

[编辑]
抱歉,忘记了……我也想同步这些动作,因为它们可以异步执行,其中一些必须按指定顺序执行。

所以如果我们有 method1method2 我也会提供类似的东西:

MyMethod1(p1, p2, c => {
                          MyMethod2(p1, p2, p3, c => {/* etc. if more */});
                       })

【问题讨论】:

  • 这太复杂了。为什么不提供一个重载接受参数?比如Action&lt;T&gt;Action&lt;T1, T2&gt;等等?
  • 因为它是一个“框架”助手,一个公司内的许多人都可以使用它。有时我们可以有 0-2 个参数,有时是 10 个。我想为此找到一个更智能的解决方案:)
  • 如果有人传递一个方法 10 个参数,他应该封装它们并传递 1 个。我认为给一个重载采用 Action&lt;T1...T5&gt; 应该对任何人都足够了。
  • 你不能在元组中添加对“依赖”动作的引用吗?在你的助手内部根据依赖对整个动作集合进行排序?
  • 如何使用myAction.DynamicInvoke(object[] parameters),其中myAction 是Delegate/Action

标签: c# helper


【解决方案1】:

使用DynamicInvoke 将在运行时解析该方法,这非常慢, 为什么不把定义参数的责任交给调用者呢。

var actions = new List<Action>()
actions.Add(new ()=> MyMethod1(p1, p2, c => {}));

这将在编译时解析方法并使函数更快。 你只是这样迭代。

foreach(var acc in actions) acc();

我相信这会更快

【讨论】:

  • 问题是(我认为),我无法处理我的“edit”案例。如果MyMethod1() 来自某个异步执行它的上下文,则可能存在问题(例如,它是某个服务的方法)。我想获取所有服务调用并以某种指定的顺序执行它们,其中每个都必须等待另一个完成。问题是我有一些机制,目前无法更改,我需要这样的同步器来同步执行操作:S
  • 我认为你可以做一个 var asyncAcc = acc as Action;如果它不为空,请执行 .Wait();我没有检查所以尝试看看它是否有效。
猜你喜欢
  • 2013-12-18
  • 2019-05-27
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多