小编Rob*_*rtN的帖子

MEF插件架构上的"即发即弃"方法

这个问题可能与设计有关,也可能与代码有关,但我被困住了,所以我对任何答案持开放态度; 一个正确的指针!

我已经使用MEF(Managed Extensibility Framework)来开发一个WPF软件,它将作为插件的协调器形式.应用程序只是在用户选择的插件之间重定向数据,因此该插件所做的事情根本不知道(特别是因为它们可以由第三方开发人员开发).应用程序和插件共享一个接口,作为了解要调用的方法的一种方式,因此流量有两种方式:插件调用主应用程序中的方法发送数据,主应用程序将此数据传递给另一个插件.

这到目前为止工作,但我遇到了同步行为的问题.接口定义的所有方法都缺少返回值(Void),而我正在努力获得一种"即发即忘"的方法,其中调用应用程序不需要等待插件接收函数来完成执行代码(和调用回到主应用程序!).

那么解决这个问题的最佳方法是什么?让每个插件(和主应用程序)将它的工作量放在某种类型的"堆栈"上,只是为了能够将控件返回到调用端,然后有一些单独运行的机制逐项工作(和这种堆叠方法是async吗?)?

其他值得注意的事情是插件在不同的线程中运行(根据调试器线程窗口),并且当它们被初始化时,它们从调用主应用程序获得引用,以便它们可以在主应用程序中触发函数.插件也经常需要告诉主应用程序它们处于什么状态(空闲,工作,错误等),并且还要发送主应用程序要记录的数据,因此这通常会创建一个嵌套的调用层次结构(如果您关注我, 难以解释).

我正在使用.Net 4.5.

下面是代码的一些简化示例.我替换了一些名字,所以如果某处有拼写错误,它只是在这里,而不是真正的代码.:)

界面:

public interface IMyPluggableApp 
{
    void PluginStatus(string PluginInstanceGuid, PluginInstanceState PluginInstanceState);
    void DataReceiver(string PluginInstanceGuid, string ConnectorGuid, object Data);
    void Logg(string PluginInstanceGuid, LoggMessageType MessageType, string Message);
}

public interface IPluginExport
{
    PluginInfo PluginInfo { get; set; }
    void Initialize(string PluginInstanceGuid, Dictionary<string, string> PluginUserSettings, IMyPluggableApp MyPluggableApp);
    void Start(string PluginInstanceGuid, List<ConnectorInstanceInfo> ConnectedOutputs);
    void Stop(string PluginInstanceGuid);
    void PluginClick(string PluginInstanceGuid);
    void PlugginTrigger(string ConnectorGuid, object Data);
}
Run Code Online (Sandbox Code Playgroud)

插件:

    public static IMyPluggableApp _MyPluggableApp

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(IPluginExport))]
public …
Run Code Online (Sandbox Code Playgroud)

c# plugins multithreading asynchronous mef

9
推荐指数
1
解决办法
1668
查看次数

标签 统计

asynchronous ×1

c# ×1

mef ×1

multithreading ×1

plugins ×1