我有一个系统,它使用System.AddIn (MAF) 在单独的进程中托管插件。在插件内部,我想使用一些利用异步和等待的代码。
由于 MAF 使用远程处理跨进程进行通信,并且我们对这种通信几乎没有控制权,因此我试图确定使用异步代码的最佳方式,而不会有遇到死锁的风险。
例如,现在我有一个合同,它定义了这样的方法:
[AddInContract]
public interface IWorker : IContract
{
string DoWork(string workToDo);
}
在 AddIn 的实现中DoWork
,我希望能够使用异步 API。如果我能想出一种将字符串转换为Task<string>
AddInAdapter 和 HostAdapter 内部的方法,那就太好了,但我想确保自己不会陷入僵局。
我想将我的视图合同定义为:
[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();
}