لماذا لم يتم رفع هذا الحدث interop أثناء تشغيله تحت موضوع STA؟

StackOverflow https://stackoverflow.com/questions/1017968

  •  06-07-2019
  •  | 
  •  

سؤال

هل يمكن لأي شخص أن يوضح لماذا لم يتم رفع حدث "OnNewmail" عند استخدام مؤشر ترابط STA في الكود أدناه؟ يحاول البرنامج استخدام مكتبة الفداء لاعتراض رسائل Outlook الواردة.

class Program
{        
    [STAThread()] // When this line is deleted the application works
    static void Main(string[] args)
    {
        RDOSession session = GetSession();
        session.OnNewMail += Session_OnNewMail;
        Console.ReadLine();
    }

    static void Session_OnNewMail(string EntryID)
    {
         Console.WriteLine("New mail received");
    }

    private static RDOSession GetSession()
    {
        var session = new RDOSession();
        var application = new ApplicationClass();

        session.MAPIOBJECT = application.Session.MAPIOBJECT;
        return session;
    }
}
هل كانت مفيدة؟

المحلول

يستخدم Com الذي يعمل على stathread مضخة الرسائل لرفع الأحداث وطرق الاتصال. عندما تكون في تطبيق وحدة التحكم ، لا توجد نافذة لضخ الرسائل لك حتى تحتاج إلى تشغيل المضخة بنفسك. (العديد من أساليب التزامن .NET سيفعل ذلك من أجلك - إلقاء نظرة على Waitone وما إلى ذلك)

إذا كان الكائن سعيدًا ضمن مؤشر ترابط MTA الافتراضي - فقد تكون أفضل حالًا باستخدام ذلك إذا كنت بحاجة إلى القيام بذلك من تطبيق وحدة التحكم.

بدلاً من القراءة - يمكنك الاستطلاع للحصول على مفتاح وضخ الرسائل باستخدام هذا:

while (Console.Read() == 0)
{
    Thread.CurrentThread.Join(100);
}

... لكن هذا هو الاختراق.

خلط COM وتطبيقات وحدة التحكم و [Stathread] مريب بعض الشيء ويمكن أن يؤدي إلى مشاكل أخرى:http://support.microsoft.com/default.aspx/kb/828988

نصائح أخرى

عندما يكون Tread هو موضوع STA وتنتظر إدخال المكتبة لا يمكن للمكتبة فعل أي شيء في نفس الوقت وليس لديه فرصة لإطلاق الحدث عند وصول البريد الإلكتروني.

من المؤكد أن المشكلة تتعلق بضخ الرسائل.

ما لم نعرف نوع كائن com rodosession (STA ، MTA ، إلخ ...) يمكننا فقط التكهن بما يجري بالفعل.

أظن أن rdosession هو كائن MTA COM وأن رمز الحدث قد ربط الحدث بطريقة أو بأخرى إلى وكيل STA أو كائن. هذا يعني أن جزءًا من رفع حدث OnNewMail يجب أن يحشد الزيادة على خيط STA. هذا ينطوي على رسالة النافذة. أنت تقوم بإجراء مكالمة قراءة بسيطة وهي مكالمة حظر ولن تقوم بمعالجة الرسائل. وبالتالي لن تحصل على الحدث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top