Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# outlook在连接folder.Items.ItemAdd每个文件夹的事件后挂起_C#_Events_Outlook_Add In - Fatal编程技术网

C# outlook在连接folder.Items.ItemAdd每个文件夹的事件后挂起

C# outlook在连接folder.Items.ItemAdd每个文件夹的事件后挂起,c#,events,outlook,add-in,C#,Events,Outlook,Add In,我有以下情况: Iam正在编写Outlook 2010加载项,并希望有一个全局事件在任何项目添加到任何文件夹时通知我。outlook的对象模型不提供全局ItemAdd事件,它只提供文件夹的Items集合的ItemAdd事件。 所以为了解决这个问题,我将所有ItemAddEvents绑定到FolderManager类的GlobalItemAddEvent 以下问题: 在我的机器上一切正常,但当客户执行它时,初始化(许多不同的邮箱和文件夹)大约需要2分钟,但没关系,它可能已正确初始化。加载完成并显示

我有以下情况: Iam正在编写Outlook 2010加载项,并希望有一个全局事件在任何项目添加到任何文件夹时通知我。outlook的对象模型不提供全局ItemAdd事件,它只提供文件夹的Items集合的ItemAdd事件。 所以为了解决这个问题,我将所有ItemAddEvents绑定到FolderManager类的GlobalItemAddEvent

以下问题: 在我的机器上一切正常,但当客户执行它时,初始化(许多不同的邮箱和文件夹)大约需要2分钟,但没关系,它可能已正确初始化。加载完成并显示Outlook时,Outlook将挂起,不接受任何命令,必须由任务管理器终止

我真的很挣扎,找不到任何解决方案或解释。有人知道这里发生了什么以及如何解决吗?谢谢

示例代码:

public class FolderManager : IFolderManager
{
    public event GlobalItemAdd GlobalItemAdded;
    private Dictionary<string, FolderContainer> _foldersMap = new Dictionary<string, FolderContainer>();

    private void InitFolders()
    {
        HashSet<string> excludeFolderIds = new HashSet<string>();
        Outlook.Stores stores = application.Session.Stores;
        foreach(Outlook.Store store in stores){
            //exclude outbox folder from event
            try
            {
                Outlook.MAPIFolder exclude = store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderOutbox);
                excludeFolderIds.Add(exclude.EntryID);
            }
            catch(COMException ex){

            }
        }
        //attach events to folders
        List<Outlook.Folder> allFolders = application.Session.GetAllFolders();
        foreach (Outlook.Folder folder in allFolders)
        {

            if(excludeFolderIds.Contains(folder.EntryID)){
                continue;
            }
            FolderContainer folderContainer = new FolderContainer(folder, this);
            _foldersMap[folderContainer.EntryID] = folderContainer;
        }
    }  
    public void ItemAdded(object added, Outlook.MAPIFolder parent)
    {
        OnGlobalItemAdded(added,parent);
    }  
}  

public class FolderContainer{
//Instance variables & Properties
//...
//...

    public FolderContainer(Outlook.MAPIFolder folder,IFolderManager manager)
    {
        _manager = manager;

        _thisFolder = folder;
        _OlItems = folder.Items;
        _OlFolders = folder.Folders;

        if (_OlItems != null)
        {
            _OlItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(ItemAdd);
        }
        if (_OlFolders != null)
        {
            _OlFolders.FolderAdd += new Outlook.FoldersEvents_FolderAddEventHandler(FolderAdd);
        }
    }

    private void ItemAdd(object item)
    {
        _manager.ItemAdded(item,_thisFolder);
    }
}
公共类FolderManager:IFolderManager
{
公共事件全局添加全局添加;
私有字典_foldersMap=新字典();
私有void InitFolders()
{
HashSet excludeFolderIds=新HashSet();
Outlook.Stores=application.Session.Stores;
foreach(Outlook.Store商店中的商店){
//从事件中排除发件箱文件夹
尝试
{
Outlook.MAPIFolder exclude=store.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderOutbox);
excludeFolderId.Add(exclude.EntryID);
}
捕获(COMException ex){
}
}
//将事件附加到文件夹
List allFolders=application.Session.GetAllFolders();
foreach(所有文件夹中的Outlook.Folder文件夹)
{
if(excludeFolderId.Contains(folder.EntryID)){
继续;
}
FolderContainer FolderContainer=新FolderContainer(文件夹,此);
_foldersMap[folderContainer.EntryID]=folderContainer;
}
}  
已添加公共无效项(已添加对象,Outlook.MAPIFolder父文件夹)
{
OnGlobalItemAdded(添加,父级);
}  
}  
公共类FolderContainer{
//实例变量和属性
//...
//...
公用FolderContainer(Outlook.MAPIFolder文件夹,IFolderManager)
{
_经理=经理;
_thisFolder=文件夹;
_OlItems=文件夹.Items;
_OlFolders=folder.Folders;
如果(_OlItems!=null)
{
_OlItems.ItemAdd+=新Outlook.ItemsEvents\u ItemAddEventHandler(ItemAdd);
}
如果(_OlFolders!=null)
{
_OlFolders.FolderAdd+=新Outlook.FoldersEvents\u FolderAddEventHandler(FolderAdd);
}
}
私有无效项添加(对象项)
{
_manager.itemsadded(item,\u thisFolder);
}
}

我建议订阅扩展MAPI通知(低级事件),而不是使用Outlook对象模型。对于Outlook来说,让一堆COM对象保持活动状态不是一个好主意。我总是建议立即释放底层COM对象。用于在使用完Outlook对象后释放该对象。如果外接程序试图枚举存储在Microsoft Exchange服务器上的集合中超过256个Outlook项目,这一点尤为重要。如果您不及时释放这些对象,您可以达到Exchange对任何时间打开的最大项目数施加的限制。然后在Visual Basic中将变量设置为Nothing(在C#中为null),以释放对对象的引用。在文章中阅读更多关于这方面的内容


例如,作为一个解决方案,您可以考虑在扩展MAPI(如赎回)周围使用任何包装器。p> 我建议订阅扩展MAPI通知(低级事件),而不是使用Outlook对象模型。对于Outlook来说,让一堆COM对象保持活动状态不是一个好主意。我总是建议立即释放底层COM对象。用于在使用完Outlook对象后释放该对象。如果外接程序试图枚举存储在Microsoft Exchange服务器上的集合中超过256个Outlook项目,这一点尤为重要。如果您不及时释放这些对象,您可以达到Exchange对任何时间打开的最大项目数施加的限制。然后在Visual Basic中将变量设置为Nothing(在C#中为null),以释放对对象的引用。在文章中阅读更多关于这方面的内容


例如,作为一个解决方案,您可以考虑在扩展MAPI(如赎回)周围使用任何包装器。p> Items.ItemAdd/etc.公开的MAPI事件仅用于UI目的。您不应该将它们用于任何类型的同步。事件不一定会发生


也就是说,在MAPI级别上,当创建消息时,存储区(IMsgStore)将触发FNEVbjectCreated事件。您只能在扩展MAPI(C++或Delphi)中使用该事件。如果使用是一个选项,则会公开事件

Items.ItemAdd/etc.公开的MAPI事件仅用于UI目的。您不应该将它们用于任何类型的同步。事件不一定会发生


也就是说,在MAPI级别上,当创建消息时,存储区(IMsgStore)将触发FNEVbjectCreated事件。您只能在扩展MAPI(C++或Delphi)中使用该事件。如果使用是一个选项,则会公开事件

谢谢你的回复!遗憾的是,我很难找到好的资源来将mapi与c#结合使用,你能给我提供一个关于如何订阅扩展mapi通知的示例,或者提供一些关于如何开始使用的好资源吗?谢谢你的回复!遗憾的是,我很难找到好的资源来将mapi与c#结合使用,你能给我举一个例子,说明如何订阅扩展mapi通知,或者如何命名好的资源来获取