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
Post a Comment