c# - Outlook 2010 VSTO AddIn: UI freezes randomly, while adding folders to PST asynchronously -


my c# vsto outlook 2010 addin adds hundreds of mapi folders imported pst file asynchronously. (pst exists in outlook foldertree)

here example:

task.factory.startnew(() => {     ... //get pststore     var rootfolder = pststore.getrootfolder();     (int = 0; < 500; i++)     {       var folder = rootfolder.folders.add("test" + datetime.now.ticks);       thread.spinwait(1000); //emulate work       marshal.releasecomobject(folder);     }     marshal.releasecomobject(rootfolder); }); 

the outlook ui freezes randomly @ rootfolder.folders.add(...) 2-3 sec. after 20, after 50 added folders.

any / tip appreciated.

expect addin stop working in outlook 2013 or newer: oom raises error detects being called thread other primary outlook thread. note applies com addins run inside outlook.exe address space. out-of-proc access marshaled main outlook thread com system (but defeats whole purpose of using oom separate thread).

only extended mapi (c++ or delphi) can used on secondary thread. if using redemption option (it can used language including c#), rdo family of objects can used on secondary threads: store value of namespace.mapiobject property on primary thread (it imapisession mapi interface), on secondary thread create instance of rdosession object (that initialize mapi on thread) , set rdosession.mapiobject property value stored on main thread - way 2 share same mapi session.

off top of head:

object mapiobject; //on class/global level .. mapiobject = application.session.mapiobject; ... task.factory.startnew(() => {   redemption.rdosession session = new redemption.rdosession();   session.mapiobject = mapiobject;   redemption.rdostore pststore = session.stores["yourstorename"];   redemption.rdofolder rootfolder = pststore.ipmrootfolder;   redemption.rdofolders folders = rootfolder.folders;   (int = 0; < 500; i++)   {      var folder = folders.add("test" + datetime.now.ticks);      marshal.releasecomobject(folder);   }   marshal.releasecomobject(folders);   marshal.releasecomobject(rootfolder);   marshal.releasecomobject(session); } 

Comments

Popular posts from this blog

sql - VB.NET Operand type clash: date is incompatible with int error -

SVG stroke-linecap doesn't work for circles in Firefox? -

python - TypeError: Scalar value for argument 'color' is not numeric in openCV -