3

我有一个系统,它使用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();
}
4

1 回答 1

0

我意识到这个问题已经存在几个月了,但是如果您愿意在与主机相同的 AppDomain 中加载您的插件,您将能够一直传递您的任务。我最近刚刚这样做并在 GitHub 上发布了我的测试项目: https
://github.com/middas/AddinProofOfConcept/blob/master/AddinProofOfConcept/ConsoleHost/Program.cs 这是指向插件的主机使用者的链接,你我们会看到最后一个测试是一个异步任务,它也有一个 CancellationToken。如果取消任务而不是等待插件设置的 30 秒,则测试通过。

于 2016-02-26T00:49:10.183 回答