首页 新闻 搜索 专区 学院

两个单元线程,一个对一个COM组件进行操作,报错如下...求助大神

0
[已解决问题] 解决于 2017-06-22 11:11

Applicaiton.Run(new mainForm)处报的异常,一个单元线程则不会

木古白水的主页 木古白水 | 初学一级 | 园豆:195
提问于:2014-01-02 16:17
< >
分享
最佳答案
0

你的一个两个单元线程是指的线程的 System.Threading.ApartmentState 属性吗?

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2014-01-02 16:23

嗯 主线程用 [STAThread] 新建了另一个线程 设置ApartmentState属性

木古白水 | 园豆:195 (初学一级) | 2014-01-02 16:25

@木古白水: 设置ApartmentState属性为 STA,是吗?

Launcher | 园豆:45045 (高人七级) | 2014-01-02 16:34

@Launcher: en

木古白水 | 园豆:195 (初学一级) | 2014-01-02 17:03

@木古白水: 然后你在这个线程中去访问 COM 组件?

Launcher | 园豆:45045 (高人七级) | 2014-01-02 17:11

@Launcher: 嗯 实例化 然后进行一系列操作

木古白水 | 园豆:195 (初学一级) | 2014-01-02 17:26

@木古白水: 是实例化的时候就抛出异常了吗?

Launcher | 园豆:45045 (高人七级) | 2014-01-02 17:27

@Launcher: 不是  是Application.Run(new MainFORM) 报的异常 

[STAThread]
static void Main()
{

try
{
string processName = "Huike.Mcs.Stock";
bool createdNew = false;
System.Threading.Mutex mutex = new System.Threading.Mutex(true, processName, out createdNew);
if(createdNew)
{

try
{
Application.Run(new MainForm());
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(),"系统提示");
}

木古白水 | 园豆:195 (初学一级) | 2014-01-02 18:00

@木古白水: 恕我眼拙,前面你告诉我你新建了一个线程,然后设置 ApartmentState 为 STA,然而你这里给出的代码我没发现有创建线程的语句,更不用说设置 ApartmentState 为 STA 了。

Launcher | 园豆:45045 (高人七级) | 2014-01-03 09:08

@Launcher: 之前那个是主线程的 这个另外一个线程 

public void Initialize(string threadName)
{
if (isRun) return;
isRun = true;
thread = new Thread(new ThreadStart(ThreadMethod));
if (threadName == "电子标签作业线程")
{
thread.SetApartmentState(ApartmentState.STA);
}
thread.Name = threadName;
thread.Start();
System.Threading.Thread.Sleep(100);
LogNotifier.Log(LogType.Info, "线程",thread.Name+" 启动", "");
}

木古白水 | 园豆:195 (初学一级) | 2014-01-03 09:24

@木古白水: Initialize 在哪儿调用的?

Launcher | 园豆:45045 (高人七级) | 2014-01-03 10:27

@Launcher: MainForm的构造函数里  主单元线程里Application.Run(new MainForm()) 又创建了另一个单元线程 所以报错?

木古白水 | 园豆:195 (初学一级) | 2014-01-03 10:34

@木古白水: 你认为是在主线程中创建了另一个单元线程所以抛出异常?那么我写了段程序来证明你的说法是错误的,请自己测试这段代码:

/// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }


public partial class Form1 : Form
    {
        Thread _thread;

        public Form1()
        {
            InitializeComponent();
            Initialize("电子标签作业线程");
        }

        public void Initialize(string threadName)
        {
            _thread = new Thread(new ThreadStart(ThreadMethod));
            _thread.SetApartmentState(ApartmentState.STA);
            _thread.Name = threadName;
            _thread.Start();            
        }

        static void ThreadMethod()
        {
            System.Diagnostics.Debug.WriteLine("Sleep 10000....");
            Thread.Sleep(10000);
        }
    }
Launcher | 园豆:45045 (高人七级) | 2014-01-03 10:49

@Launcher: 我只是猜测而已... 这个异常我完全无从下手

木古白水 | 园豆:195 (初学一级) | 2014-01-03 10:52

@木古白水: 虽然有很多方法来很快找到抛出异常的代码,但是我还是推荐给你一个最简单,但却最有助于提高你的分析能力的方法,那就是对代码做删减。将你的 ThreadMethod 方法写成我那样,你看看你的程序还抛出异常吗?

Launcher | 园豆:45045 (高人七级) | 2014-01-03 10:59

@Launcher: 嗯 好的 谢了 

木古白水 | 园豆:195 (初学一级) | 2014-01-03 11:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册