Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理来自不同线程的线程的最佳方法是什么?_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 处理来自不同线程的线程的最佳方法是什么?

C# 处理来自不同线程的线程的最佳方法是什么?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我的要求是处理来自不同线程的线程。我可以处理thread.Suspend()、thread.Resume()和thread.Abort()但是我收到了一个警告,好像这些方法已经被弃用了。如果有任何替代这些方法的方法,我创建了一个虚拟控制台应用程序,它与我的应用程序类似,请帮助解决这个问题。 下面是我的代码 using System; using System.Threading; namespace ThreadingTest { internal class Program

我的要求是处理来自不同线程的线程。我可以处理
thread.Suspend()
thread.Resume()
thread.Abort()
但是我收到了一个警告,好像这些方法已经被弃用了。如果有任何替代这些方法的方法,我创建了一个虚拟控制台应用程序,它与我的应用程序类似,请帮助解决这个问题。 下面是我的代码

using System;
using System.Threading;

namespace ThreadingTest
{
    internal class Program
    {
        private static Thread mainThread;

        private static void Main(string[] args)
        {
            mainThread = Thread.CurrentThread;

            Thread connectServerThread = new Thread(new ThreadStart(ConnectServer));
            connectServerThread.Start();

            int i = 0;
            while (true)
            {
                if (i++ % 5000 == 0)
                {
                    Console.WriteLine(i);
                }
            }
        }

        private static void ConnectServer()
        {
            for (int i = 0; i < 20; i++)
            {
                Thread.Sleep(2000);
                if (i % 2 == 0)
                {
                    mainThread.Suspend();
                }
                else
                {
                    mainThread.Resume();
                }
            }
            mainThread.Abort();
        }
    }
}
使用系统;
使用系统线程;
命名空间线程测试
{
内部课程计划
{
私有静态线程主线程;
私有静态void Main(字符串[]args)
{
mainThread=Thread.CurrentThread;
线程connectServerThread=新线程(新线程开始(ConnectServer));
connectServerThread.Start();
int i=0;
while(true)
{
如果(i++%5000==0)
{
控制台写入线(i);
}
}
}
私有静态void ConnectServer()
{
对于(int i=0;i<20;i++)
{
《睡眠》(2000年);
如果(i%2==0)
{
mainThread.Suspend();
}
其他的
{
mainThread.Resume();
}
}
mainThread.Abort();
}
}
}

我会按照

不要使用Suspend和Resume方法来同步线程的活动。挂起线程时,无法知道线程正在执行什么代码。如果在安全权限评估期间挂起一个线程,而该线程持有锁,则AppDomain中的其他线程可能会被阻止。如果在线程执行类构造函数时挂起该线程,则AppDomain中尝试使用该类的其他线程将被阻止。死锁很容易发生

更具体地说,警告提供了以下建议:

请使用System.Threading中的其他类(如监视器、互斥体、事件和信号量)来同步线程或保护资源


我总是希望线程类中有一个标志(isRunning)和一个while(isRunning){…},然后您可以从外部将该标志设置为false。您应该只向线程发送一个请求,并让线程(代码)自行管理如何处理该请求。如果线程正在向文件写入数据,而您挂起或中止了它,该怎么办?它将以损坏的数据结束。但在我的情况下,我必须执行500个步骤或一行代码,如果我设置了一个标志,那么在每个步骤中,我都需要检查该标志,这对我来说是不可行的。@SirRufo它是一个虚拟应用程序,不是实际的,它的实现是不同的。我一般说的是线程/任务