【问题标题】:Generated asynchronous method calls in C# - AOP?在 C# 中生成异步方法调用 - AOP?
【发布时间】:2011-03-21 00:24:03
【问题描述】:

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

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

除了通常调用: 用户 userBO = Resolve().Login("name", "pass"); 我想使用类似的东西: Resolve().Login("name", "pass", delegate(object, SomeArgs e) { User userBO = e.Args....};

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

有没有办法使用第三方工具来实现这一点,还是我必须手动重写整个异步?

欢迎任何想法。 谢谢。

【问题讨论】:

  • 您始终可以编写自己的工具来创建 BeginXXX EndXXX 方法对并将它们放入部分类中 - 类似于 Web 服务引用代码生成的工作方式。代码的管道基本相同,因此是自动化的完美候选者。我不知道为此目的而想到的第三方工具。

标签: c# .net asynchronous aop business-logic


【解决方案1】:

我不知道有什么工具可以为你做这件事,但是有一种简单的方法可以将它们包装在 Task 对象中。这至少比手动定义Async 方法和event 回调要容易。

一般概念是将方法作为Task 运行,然后将任务继续调度到 UI 线程。

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

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 或任何数据绑定对象是安全的。

Task 对象还完全支持其他常见的异步方案,尤其是取消和进度报告。

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

【讨论】:

  • 看起来很有趣——当任务被阻塞时它的表现如何? UI 会阻塞吗?
  • 感谢大家提供的信息,我需要深入研究 T4 模板。到目前为止,我只在 EF 中使用过它们。我正在考虑异步接口,因为它提供了合成糖:IUser blUser = Resolve().Login(...) 然后 IUserAsynchronous = Resolve().LoginAsync(...., callback)...
  • 我相信我会自己编写这个工具。如果这个工具能够在我创建新的 BL 方法并构建项目时创建异步方法,那就太好了。只是想法......这样输出的异步 dll 也将包含适当的异步方法......
  • 就个人而言,我更喜欢任务延续。但如果你喜欢IAsyncInvoke 风格,请注意Task 类实际上实现了IAsyncInvoke。因此,您可以从您的 BeginLogin 方法中返回它,并在您的 EndLogin 方法中提取结果。
猜你喜欢
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多