C# 一个类中的两个线程必须执行不同的操作。我的代码不起作用

C# 一个类中的两个线程必须执行不同的操作。我的代码不起作用,c#,multithreading,C#,Multithreading,我有一张表格。单击按钮时,它应重定向到包含2个类的dll。 Classxyz: 有两个线程。 线程1:应具有将字符串插入数组的方法 线程2:应该具有从数组返回第一个元素的方法 类数组: 该数组位于类数组中 我的问题: 我无法理解线程是否正在执行任务 xyz类: public void ToDo(string str) { ThreadObject firstThreadObject = new ThreadObject(); firs

我有一张表格。单击按钮时,它应重定向到包含2个类的dll。
Classxyz:
有两个线程。
线程1:应具有将字符串插入数组的方法
线程2:应该具有从数组返回第一个元素的方法
类数组:
该数组位于类数组中

我的问题:
我无法理解线程是否正在执行任务

xyz类:

        public void ToDo(string str)
       {
        ThreadObject firstThreadObject = new ThreadObject();
        firstThreadObject.str = str;


        Thread firstThread = new Thread(DoWorkpeek);
        firstThread.Start(firstThreadObject);


        ThreadObject secondThreadObject = new ThreadObject();

        secondThreadObject.str = str;
        Thread secondThread = new Thread(DoWorkenque);
        secondThread.Start(secondThreadObject);

        firstThread.Abort();
        secondThread.Abort();

    }

    public void DoWorkpeek(object parameter)
    {
        ThreadObject threadObject = parameter as ThreadObject;
        str1 = objq.queuepeek(threadObject.str);
        MessageBox.Show(str1);
    }
    public void DoWorkenque(object parameter)
    {
        ThreadObject threadObject = parameter as ThreadObject;
        objq.enqueue(threadObject.str);
    }
我的代码正确吗

MessageBox.show(str1);
未显示。

首先,
Join()
线程,不要
中止()

其次,您可以使用
ParameterizedThreadStart
对象来启动线程,如下所示:

Thread firstThread = new Thread(new ParameterizedThreadStart(DoWorkpeek));
firstThread.Start(str);

...

firstThread.Join();
secondThread.Join();
ThreadObject threadObject = parameter as ThreadObject;
lock(objq)
    str1 = objq.queuepeek(threadObject.str);
MessageBox.Show(str1);
此外,请确保两个线程都可以访问您的objq对象(例如是静态的),并在访问时锁定它,如下所示:

Thread firstThread = new Thread(new ParameterizedThreadStart(DoWorkpeek));
firstThread.Start(str);

...

firstThread.Join();
secondThread.Join();
ThreadObject threadObject = parameter as ThreadObject;
lock(objq)
    str1 = objq.queuepeek(threadObject.str);
MessageBox.Show(str1);

另外,您可以使用
System.Diagnostics.Debug.WriteLine(str1)
并写入调试输出窗口,而不是使用
MessageBox.Show(str1)

谢谢。我在调试窗口中得到了输出。由于messageBox不工作,我不确定控件是否到达了代码的那一部分并且工作正常。你能解释一下为什么Join()比abort()更好吗。我是线程编程新手。而且,只有在使用parameterizedThreadStart时,参数才会联合排序吗?嗯,Abort()终止线程并可能中断其执行。Join()等待线程完成以继续执行。查看这些链接以查看详细信息:和。ParameterizedThreadStart是向线程传递参数的常用方法。