Outlook 2010 추가 기능을 개발하고 있습니다.크로스 스레드 작업 가져 오는 중 Outlook 추가 기능에서 예외가 발생했습니다.
메인 추가 기능 클래스는이 같은 비동기 작업을 시작하고 다른 형태에서 suscribe하는 정적 이벤트를 선언한다 :
int ProcesadosArchivado = 0;
public delegate void OnFileArchivedDelegate (int NumFilesArchived, string NameArchived);
public static event OnFileArchivedDelegate OnFileArchivedEvent = delegate { };
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Thread hiloArchivado = new Thread(DoArchiveBackground);
hiloArchivado.Start();
}
private void DoArchiveBackground()
{
try
{
Outlook.Application app = null;
Outlook._NameSpace ns = null;
Outlook.MailItem item = null;
//Outlook.MAPIFolder inboxFolder = null;
DateTime MyDateTime = DateTime.Now.AddMonths(-3);
app = new Outlook.Application();
ns = app.GetNamespace("MAPI");
ns.Logon(null, null, false, false);
Outlook.Stores store;
Outlook.MAPIFolder rootFolder = null;
store = Application.Session.Stores;
foreach (Outlook.Store storeClass in store.Session.Stores)
{
rootFolder = storeClass.GetRootFolder();
}
Outlook.MAPIFolder folder = rootFolder.Folders["ARCHIVAR"];
Outlook.MAPIFolder ArchivarFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
// inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
for (int i = 1; i <= ArchivarFolder.Items.Count; i++)
{
try
{
item = (Microsoft.Office.Interop.Outlook.MailItem)ArchivarFolder.Items[i];
ProcesadosArchivado += 1;
OnFileArchivedDelegate myEvent = OnFileArchivedEvent;
myEvent.Invoke(ProcesadosArchivado, item.Subject);
//Messate iteration
}
catch (Exception ex)
{
throw;
}
}
}
//Catch folder iteration
catch (Exception ex)
{
throw;
}
}
가 그럼 난 다른 형태의 정적 이벤트에 suscribe 일부를 업데이트하려고 InvokeRequired 사용하여 컨트롤 및 대표 :
public partial class ArchiveForm : Form
{
private delegate void UpdateControlDelegate (Control control,string Property,string value);
public ArchiveForm()
{
InitializeComponent();
this.Load += new EventHandler(ArchiveForm_Load);
}
void ArchiveForm_Load(object sender, EventArgs e)
{
ThisAddIn.OnFileArchivedEvent += new ThisAddIn.OnFileArchivedDelegate(ThisAddIn_OnFileArchivedEvent);
}
void ThisAddIn_OnFileArchivedEvent(int NumFilesArchived, string NameArchived)
{
updateControls(NumFilesArchived,NameArchived);
}
void UpdateControl(Control control,string Property,string value)
{
PropertyInfo prop = control.GetType().GetProperty("Text");
prop.SetValue(control,
Convert.ChangeType(value, prop.PropertyType), null);
}
private void updateControls(int NumFilesArchived, string NameArchived)
{
if (lblArchivado.InvokeRequired)
{
UpdateControlDelegate del = new UpdateControlDelegate(UpdateControl);
//del.BeginInvoke(lblArchivado, "Text", "Archivados: " + NumFilesArchived.ToString(), null, null);
del.Invoke(lblArchivado, "Text", "Archivados: " + NumFilesArchived.ToString());
}
else
this.lblArchivado.Text = "Archivados: " + NumFilesArchived.ToString();
if (lblAsunto.InvokeRequired)
{
UpdateControlDelegate del = new UpdateControlDelegate(UpdateControl);
//del.BeginInvoke(lblAsunto, "Text", "Asunto: " + NameArchived, null, null);
del.Invoke(lblAsunto, "Text", "Asunto: " + NameArchived);
}
else
this.lblAsunto.Text = "Asunto: " + NameArchived;
}
}
임 점점 크로스 헤드 잘못된 연산 예외,라인 도달시 :
* prop.SetValue (control, Convert.ChangeType (value, prop.PropertyType), null); *
나는이 예외를 받고있는 이유 정말 얻을 해달라고, 그래서 그것은 invoreRequired을 통해 얻고 대리자를 호출한다. 이에
del.Invoke(lblAsunto, "Text", "Asunto: " + NameArchived);
: