का उपयोग करने की आवश्यकता है मैंने एक विंडोज सेवा बनाई है जो कुछ COM घटकों को कॉल कर देगी, इसलिए मैंने मुख्य कार्य में [STAThread] को टैग किया। हालांकि, जब टाइमर आग लगती है, तो यह एमटीए की रिपोर्ट करता है और COM कॉल विफल हो जाती है। मैं इसे कैसे ठीक करूं?.NET विंडोज सेवा को STAThread
using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.Threading;
using System.Timers;
namespace MyMonitorService
{
public class MyMonitor : ServiceBase
{
#region Members
private System.Timers.Timer timer = new System.Timers.Timer();
#endregion
#region Construction
public MyMonitor()
{
this.timer.Interval = 10000; // set for 10 seconds
this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);
}
#endregion
private void timer_Elapsed (object sender, ElapsedEventArgs e)
{
EventLog.WriteEntry("MyMonitor", String.Format("Thread Model: {0}", Thread.CurrentThread.GetApartmentState().ToString()), EventLogEntryType.Information);
}
#region Service Start/Stop
[STAThread]
public static void Main()
{
ServiceBase.Run(new MyMonitor());
}
protected override void OnStart (string[] args)
{
EventLog.WriteEntry("MyMonitor", "My Monitor Service Started", EventLogEntryType.Information);
this.timer.Enabled = true;
}
protected override void OnStop()
{
EventLog.WriteEntry("MyMonitor", "My Monitor Service Stopped", EventLogEntryType.Information);
this.timer.Enabled = false;
}
#endregion
}
}
+1; हालांकि, आप कैसे समझाते हैं कि कंसोल अनुप्रयोगों के लिए एक ही समस्या मौजूद है? मेरी समझ से आपकी व्याख्या हालांकि सही नहीं लगती है। सेवा नियंत्रण प्रबंधक (और थ्रेड के रूप में नहीं) की एक बाल प्रक्रिया के रूप में एक सेवा शुरू की जाती है और फिर सेवा 'StartServiceCtrlDispatcher' (जिसे मैं प्रतिबिंब में देख सकता हूं) से कॉल करके नियंत्रक से जुड़ती है, इसलिए एसटीए के रूप में सेवा शुरू करना चाहिए मुमकिन। –
यह कंसोल ऐप्स के लिए मौजूद नहीं है। कंसोल ऐप्स STAThreadAttribute का सम्मान करते हैं। सेवाएं नहीं एससीएम एक एसटीए धागे में नहीं चला है। एससीएम का सम्मान नहीं करता है और न ही यह उनकी वांछित अपार्टमेंट स्थिति को संवाद करने के लिए सेवाओं के लिए कोई तरीका प्रदान करता है। ओपी का कोड उलझन में है, क्योंकि इसमें मुख्य विधि शामिल है। सभी मुख्य विधि कहती हैं, "अरे, एससीएम, यहां एक डीएलएल है जिसमें एक सेवा प्रकार है जिसमें मैं चाहता हूं कि आप दौड़ें, kthxbai" और चले जाओ। हाँ, जो एक एसटीए धागे में चलता है, लेकिन यह ब्लॉक नहीं करता है और तुरंत लौटता है। एससीएम तब निर्धारित करता है कि सेवा को अपने धागे का उपयोग करके कब चलाया जाए। – Will
विल, वेब और कुछ प्रतिक्रियाओं पर कुछ और देखने के बाद, मेरे पास एक नई संरचना है (इसे टिप्पणी के रूप में छोड़ने के लिए पर्याप्त वर्ण नहीं थे) –