使用了c#高内存。适用于ManagementObjectSearcher

使用了c#高内存。适用于ManagementObjectSearcher,c#,multithreading,usb,C#,Multithreading,Usb,使用线程。但我不能阻止它。线程始终运行,应用程序占用内存高。 几分钟后给出一个错误。可能我不能使用函数true。这是因为您在没有任何退出条件的情况下递归调用线程的方法。这最终将导致一个堆栈溢出异常 与此方法不同,您应该在线程的方法中放置while循环这当然是粗略地实现的,只是为了给您一个想法: private void Form1_Load(object sender, EventArgs e) { t = new Thread(new ThreadStart(serialcek));

使用线程。但我不能阻止它。线程始终运行,应用程序占用内存高。
几分钟后给出一个错误。可能我不能使用函数true。

这是因为您在没有任何退出条件的情况下递归调用线程的方法。这最终将导致一个
堆栈溢出异常

与此方法不同,您应该在线程的方法中放置
while
循环这当然是粗略地实现的,只是为了给您一个想法:

private void Form1_Load(object sender, EventArgs e)
{

    t = new Thread(new ThreadStart(serialcek));
    CheckForIllegalCrossThreadCalls = false;
    t.Start();
  }

public void serialcek()
{

    ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
    try
    {
        foreach (ManagementObject currentObject in theSearcher.Get())
        {
            ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
            try
            {
                serial = theSerialNumberObjectQuery["SerialNumber"].ToString();
                textBox1.Text = serial;
            }
            catch (Exception)
            {
                // MessageBox.Show("Bişiler oldu bende anlamadım");

            }

        }
        Thread.Sleep(sure);
        serialcek();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Patladım ben." + ex.Message.ToString());
    }

}
然后,只要将
true
分配给
exitThread
,您就可以随时退出此线程:

bool exitThread;

private void Form1_Load(object sender, EventArgs e)
{

    t = new Thread(new ThreadStart(serialcek));
    CheckForIllegalCrossThreadCalls = false;
    exitThread = false;
    t.Start();
  }

public void serialcek()
{

    ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");
    while (! exitThread)
    {
        try
        {
            foreach (ManagementObject currentObject in theSearcher.Get())
            {
                ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
                try
                {
                    serial = theSerialNumberObjectQuery["SerialNumber"].ToString();
                    textBox1.Text = serial;
                }
                catch (Exception)
                {
                    // MessageBox.Show("Bişiler oldu bende anlamadım");

                }

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Patladım ben." + ex.Message.ToString());
        }
        finally
        {
            // Moved Sleep into 'finally' block to make it be called even if an exception occurs
            Thread.Sleep(sure);
    }    
}
private void Button1_Click(object sender, EventArgs e)
{
    exitThread = true;
}