//C# 挂起恢复运行线程代码 暂时没找到和测试出替换Thread.Resume()恢复运行和Thread.Suspend()暂停挂起的函数
//添加引用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Threading;
using System.Collections;
//定义变量
private Thread convertThread;
private Mutex mutex = new Mutex();
Queue myThreadQueue=new Queue();
//按钮事件
private void btnConstraintToBig5_Click(object sender, EventArgs e)
{
this.btnConstraintToBig5.Enabled = false;
//测试数据库连接
this.richTextBox1.Text = "";
CurrentServerName = this.txtServerName.Text.Trim();
CurrentDatabaseName = this.txt_DatabaseName.Text.Trim();
CurrentUserName = this.txt_UserName.Text.Trim();
CurrentUserPassword = this.txt_Password.Text.Trim();
CurrentConnectionString = "Data Source=" + CurrentServerName + ";Initial Catalog=Master;User ID=" + CurrentUserName + ";password=" + CurrentUserPassword;
DataTable myDataTable = new DataTable();
try
{
SqlConnection thisConnection = new SqlConnection(CurrentConnectionString);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand("select * from sysservers", thisConnection);
DataSet ds = new DataSet();
da.Fill(ds, "Temp");
myDataTable = ds.Tables["Temp"];
thisConnection.Close();
if (myDataTable.Rows.Count > 0)
{
this.richTextBox1.Text += "/r/n建立到数据库连接成功";
CurrentConnectionString = "Data Source=" + CurrentServerName + ";Initial Catalog=" + CurrentDatabaseName + ";User ID=" + CurrentUserName + ";password=" + CurrentUserPassword;
convertThread = new Thread(new ThreadStart(StartConvertConstraintToBig5));
convertThread.IsBackground = true;
convertThread.Start();
}
else
{
this.richTextBox1.Text += "/r/n建立到数据库连接失败";
}
}
catch (Exception ex)
{
this.richTextBox1.Text += "/r/n建立到数据库连接出错" + ex.Message;
}
}
//线程调用函数
/// <summary>
/// 线程调用的监听转换数据表约束到简体版函数
/// </summary>
private void StartConvertConstraintToBig5()
{
lock (myThreadQueue)
{
mutex.WaitOne();
myDataBaseConverter.BeginConvertingMessage += new DataBaseEventHandler(OnBeginMessageReceived);
myDataBaseConverter.EndConvertingMessage += new DataBaseEventHandler(OnEndMessageReceived);
myDataBaseConverter.CurrentConvertingMessage += new DataBaseEventHandler(OnCurrentMessageReceived);
myDataBaseConverter.ConvertingErrorMessage += new DataBaseEventHandler(OnErrorMessageReceived);
myDataBaseConverter.ConvertTableConstraintToBig5(CurrentConnectionString);
mutex.ReleaseMutex();
}
}
//暂停恢复线程运行
private void btnPauseConverting_Click(object sender, EventArgs e)
{
if (convertThread != null)
{
Console.WriteLine("当前线程状态名称:" + convertThread.ThreadState.ToString());
Console.WriteLine("当前线程状态编号:" + Convert.ToInt32(convertThread.ThreadState).ToString());
if (this.btnPauseConverting.Text == "继续转换" && Convert.ToInt32(convertThread.ThreadState) == 68)
{
try
{
this.btnPauseConverting.Text = "暂停转换";
convertThread.Resume();
}
catch (Exception msg)
{
MessageBox.Show(msg.ToString(), "异常");
}
}
else if (this.btnPauseConverting.Text == "暂停转换" && Convert.ToInt32(convertThread.ThreadState) == 36)
{
try
{
this.btnPauseConverting.Text = "继续转换";
convertThread.Suspend();
}
catch (Exception msg)
{
MessageBox.Show(msg.ToString(), "异常");
}
}
}
}
分享到:
相关推荐
挂起线程意味着暂停该线程的执行,但保留其状态,以便稍后恢复。在C#中,我们可以通过调用Thread类的`Suspend()`方法来挂起线程。然而,这个方法并不推荐使用,因为它可能导致死锁或其他难以预料的问题。通常,我们...
在这个"10.6_C#恢复和挂起线程的源代码例子"中,我们很可能会看到如何在C#中实现线程的管理和控制。 在C#中,`System.Threading`命名空间提供了管理线程的类和方法。线程的挂起主要是通过`Thread.Suspend()`方法,...
摘要:C#源码,系统相关,线程挂起 学习C#的一个小例子,用C#恢复和挂起线程的源代码,用线程起始点的ThreadStart委托创建该线程的实例,以控制台形式展示线程的启动、挂起和恢复挂起,比较基础的例子,希望C#新手好好...
`Thread.ThreadState`属性可以获取线程当前的状态,而`Thread.Suspend`和`Thread.Resume`分别用于挂起和恢复线程,但这些方法在某些情况下可能导致死锁,应谨慎使用。 七、线程优先级 每个线程都有一个优先级,`...
- **线程状态**:线程有多种状态,如新建、就绪、运行、阻塞、等待、挂起和终止等,了解这些状态对于管理线程至关重要。 2. **线程同步与互斥** - **Mutex**:用于限制同时访问特定资源的线程数量,确保同一时间...
线程的生命周期包括新建、就绪、运行、等待、挂起、恢复和终止等状态。线程的生命周期管理是多线程编程中重要的概念,如需控制线程执行,可以使用Join、Abort、Interrupt等方法。 三、线程同步与互斥 在多线程环境...
本人利用Thread.Abort()与Thread.Interrupt()可以引起目标线程异常的特点,开发了一种不使用已过时的方法来变相从外部控制线程的挂起与恢复的技术,原理简单,方便理解。 相关技术参考:...
线程有多种状态,如新建(New)、就绪(Runnable)、运行(Running)、挂起(Suspended)和终止(Terminated)。开发者可以使用`Thread.CurrentThread`获取当前线程并检查或更改其状态。 八、线程中断 `Thread....
1. **线程状态**:包括新建、就绪、运行、阻塞、等待、挂起、终止等,了解这些状态有助于理解和调试多线程问题。 2. **Join**:线程A调用线程B的Join方法,会等待B线程结束后再继续执行。 3. **Thread.Abort**:...
本文将详细介绍如何在C#中创建和管理线程,包括启动线程、终止线程、挂起线程、恢复线程以及设置线程优先级等基本操作。 #### 1. 创建线程 创建线程是多线程应用的基础。在.NET框架中,可以通过`System.Threading`...
一种更安全的挂起线程的方法是使用条件变量或线程池。在Java中,可以使用`Lock`接口和`Condition`接口来实现线程的等待和唤醒。线程在满足特定条件时等待,当条件改变时被唤醒继续执行。例如: ```java Lock lock = ...
2. **线程状态**:包括新建、就绪、运行、等待、挂起、停止等多种状态。 异常处理: 1. **ThreadAbortException**:当调用`Thread.Abort()`时抛出,表示线程被强制中断。 2. 使用`try-catch`块捕获线程内的异常,...
本示例主要介绍如何在C#中利用WindowAPI来挂起和恢复进程。 首先,我们需要了解WindowAPI中的两个关键函数:`ResumeThread`和`SuspendThread`。这两个函数是Windows API的一部分,用于控制线程的状态。`...
在本示例中,开发者可能通过添加`ToolStripMenuItem`来创建如“挂起线程”和“恢复线程”的菜单项,然后为这些菜单项分配事件处理程序以实现相应的功能。 4. **线程控制**: C#中没有直接的挂起和恢复线程的方法,...
挂起线程意味着暂时停止线程的执行,让其他线程有机会运行。在.NET Framework早期版本中,提供了`Thread.Suspend()`方法来实现挂起,但出于安全性和并发性的考虑,该方法已被弃用。现在,推荐使用`Monitor.Pulse()`...
- 线程的状态包括新建、就绪、运行、等待、挂起、停止等,理解这些状态有助于编写更健壮的多线程程序。 - `Thread.Join`方法用于等待指定线程结束,而`Thread.Abort`可以强制终止线程,但应谨慎使用,因为它可能...
线程的生命周期包括新建、就绪、运行、阻塞、等待、挂起、恢复和终止等状态。 其次,C#提供了`ThreadPool`类,它是一个线程池,用于管理和重用线程,减少创建和销毁线程的开销。线程池中的线程可以执行异步操作,如...
这样,当主线程结束时,后台线程也会随之结束,防止程序挂起。 总结来说,这个实例展示了如何在C#中使用队列Queue进行多线程编程,包括创建队列、入队、出队以及创建和启动线程。理解这些基本概念和操作对于开发...
### C#中多线程与界面卡顿问题详解 #### 一、问题概述 在C#应用程序开发中,特别是Windows Forms应用中,界面卡顿是一个常见的问题。这往往发生在使用了多线程的情况下,尽管多线程技术可以有效提高程序性能,但...
此外,可能还涉及到了线程的生命周期管理,包括启动线程(Thread.Start)、线程的优先级设置(Thread.Priority)、线程的挂起和恢复(Thread.Suspend和Thread.Resume,但这两个方法现在已不推荐使用),以及线程的...