代码之家  ›  专栏  ›  技术社区  ›  Stefan Szasz

在c-aop中生成异步方法调用?

  •  2
  • Stefan Szasz  · 技术社区  · 14 年前

    我正在开发一个WPF应用程序,它使用一个BusinessLogic层(当前是单个DLL),在该层中,我创建了将直接从UI调用的BL方法。每个BL管理器通过Unity解决(考虑切换到MEF,尽管…)。BL类实现了一个特定的接口,当然它有一个priate方法。

    现在,我想要创建(或者更确切地说生成)一个新的异步方面,比如程序集(或者更多…),它应该具有与原始程序集中定义的类似的方法/操作(相同的参数…)以及作为参数的回调委托。 所以基本上我希望异步方法是用一些框架生成的…

    除了通常打电话给: user userbo=resolve().login(“name”,“pass”); 我想用类似的东西: resolve().login(“name”,“pass”,delegate(object,someargs e)user userbo=e.args….;

    现在,我希望生成这个程序集,而不是为每个方法编写新的EventArgs和委托。 我知道PostSharp可以帮助完成AOP任务,但是在异步方法的新dll中,我找不到任何有关此代码生成机制的内容。

    有没有一种方法可以使用第三方工具来实现这一点,或者我必须手动重写整个异步操作?

    欢迎有任何想法。 谢谢您。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Stephen Cleary    14 年前

    我不知道有什么工具可以为你做这个,但是有一个简单的方法可以将它们包装起来 Task 物体。这至少比手动定义更容易 Async 方法和 event 回调。

    一般的概念是将该方法作为 任务 然后将任务继续调度到UI线程。

    首先,定义一个调度程序(您不需要每次都这样做;它可以是全局var或窗口级var):

    TaskScheduler ui = TaskScheduler.FromCurrentSynchronizationContext();
    

    然后,当您想要调用一个方法并处理它的返回值时:

    var bll = Resolve();
    Task.Factory.StartNew(_ => bll.Login("name", "pass"))
      .ContinueWith(task =>
      {
        // Note: accessing Result will raise any exceptions thrown by Login
        User userBO = task.Result;
        ...
      }, ui);
    

    它没有您建议的语法那么漂亮,但是它是可用的。任务继续传递给 ContinueWith 将在UI线程上运行,因此可以安全地更新UI或任何数据绑定对象。

    任务 对象还完全支持其他常见的异步场景,特别是取消和进度报告。

    由于这种方法实际上不向类中添加事件,因此应该可以编写一个 T4 为您生成扩展方法的模板(例如, LoginTask(string username, string password, Action<Task<User>> continuation) )