【发布时间】:2015-11-22 04:10:05
【问题描述】:
我有一个使用System.AddIn (MAF) 在不同进程中托管插件的系统。在插件中,我想使用一些利用 async 和 await 的代码。
由于 MAF 使用远程处理跨进程进行通信,并且我们对此通信几乎没有控制权,因此我正在尝试确定使用异步代码的最佳方式,而不会有遇到死锁的风险。
例如,现在我有一个合同,它定义了这样的方法:
[AddInContract]
public interface IWorker : IContract
{
string DoWork(string workToDo);
}
在 DoWork 的 AddIn 实现中,我希望能够使用异步 API。如果我能想出一种在 AddInAdapter 和 HostAdapter 中从字符串转换为 Task<string> 的方法,那就太好了,但我想确保自己不会陷入僵局。
我想将我的视图合同定义为:
[System.AddIn.Pipeline.AddInBaseAttribute()]
public interface IWorker
{
Task<string> DoWork(string workToDo);
}
那么在合约中执行以下操作来查看适配器是否安全:
public virtual string DoWork(string workToDo)
{
var t = _view.DoWork(Contracts.AddInSideAdapters.DoWorkAddInAdapter.ContractToViewAdapter(workToDo)).ConfigureAwait(false);
return t.GetAwaiter().GetResult();
}
【问题讨论】:
-
如果你的 DoWork 不是异步的,那么就不要做异步...否则只是
await并且不要使用任何其他异步方法(GetAwaiter()、GetResult() .Wait , 结果) -
那么,如果需要使用只公开异步端点的 API,我只需在这些调用上调用
.Result()?我问的原因是我希望开发插件的人不必考虑是否异步。 -
@PeterDuniho 如果您了解 MAF,那么“查看合约”和“查看适配器的合约”是在应用于此问题时提供足够的上下文来理解
Task<string>如何转换为string在 MAF 管道中。我认为这是一个非常具体和有针对性的问题,适合 StackOverflow,但可能仅限于少数有专业知识的人来回答这个问题。 -
在 MAF 中没有跨应用程序域/进程编组任务的直接方法。如果您要自己实现插件模型,那么很少有文章展示如何跨应用程序域进行任务编组。
标签: c# async-await maf