c#中sleep()并不能让子线程休息
一个关于c#的问题:子线程在主线程中,子线程在循环,有些地方要休息一下再操作,比如写串口操作等,但是子线程中的sleep()方法并不能让子线程休息。请问应该如何解决部分代...
一个关于c#的问题:子线程在主线程中,子线程在循环,有些地方要休息一下再操作,比如写串口操作等,但是子线程中的sleep()方法并不能让子线程休息。请问应该如何解决
部分代码:
private ThreadStart threadstart;
public Thread newThread;
public void StartWork(){}
按钮中的事件
threadstart = new ThreadStart(StartWork);
newThread = new Thread(threadstart);
newThread.Start();
this.Test_thing();
public void Test_thing(){...Thread.Sleep(8000);...}
休息的是threadstart进程 展开
部分代码:
private ThreadStart threadstart;
public Thread newThread;
public void StartWork(){}
按钮中的事件
threadstart = new ThreadStart(StartWork);
newThread = new Thread(threadstart);
newThread.Start();
this.Test_thing();
public void Test_thing(){...Thread.Sleep(8000);...}
休息的是threadstart进程 展开
展开全部
你需要指定时间的,单位为毫秒
而且注意写的地方,在哪个线程中写就是哪个线程休息
补充:
不太明白你什么意思,你的代码是:
threadstart = new ThreadStart(StartWork); // 创建一个StartWork方法的委托
newThread = new Thread(threadstart); // 创建一个使用委托的线程
newThread.Start(); // 线程开始执行
this.Test_thing(); 调用了this_thing()函数,因为this_thing是在主进程中执行的,所以挂起的是主进程而不是StartWork
这样才对,你却说他挂起了threadstart进程,这是什么意思?若你想要StartWork挂起,Thread.Sleep(8000)写在StartWork里,在哪个线程中运行这个方法,就是挂起哪个线程
而且注意写的地方,在哪个线程中写就是哪个线程休息
补充:
不太明白你什么意思,你的代码是:
threadstart = new ThreadStart(StartWork); // 创建一个StartWork方法的委托
newThread = new Thread(threadstart); // 创建一个使用委托的线程
newThread.Start(); // 线程开始执行
this.Test_thing(); 调用了this_thing()函数,因为this_thing是在主进程中执行的,所以挂起的是主进程而不是StartWork
这样才对,你却说他挂起了threadstart进程,这是什么意思?若你想要StartWork挂起,Thread.Sleep(8000)写在StartWork里,在哪个线程中运行这个方法,就是挂起哪个线程
展开全部
你好!
由于看不到你的代码,所以看不出问题所在.
可以给你一个参考的示例:
C#线程暂停与开启
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;
namespace AutoResetEventTest
{
public partial class Form1 : Form
{
private ManualResetEvent manualResetEvent;
private AutoResetEvent auto;
private bool suspend;
private AsyncOperation asyncOperation;
public delegate void InvokeDelegate(string str);
private InvokeDelegate invokeDelegate;
const string str = "Test";
private bool formClosed;
public Form1()
{
InitializeComponent();
manualResetEvent = new ManualResetEvent(false);
auto = new AutoResetEvent(true);
asyncOperation = AsyncOperationManager.CreateOperation(null);
invokeDelegate = new InvokeDelegate(this.SafeInvoke);
this.FormClosed += delegate
{
this.formClosed = true;
this.auto.Close();
};
}
private void btnStart_Click(object sender, EventArgs e)
{
this.btnStart.Enabled = false;
this.btnSuspend.Enabled = true;
ThreadPool.QueueUserWorkItem(delegate
{
SafeInvoke();
//this.BeginInvoke(invokeDelegate, new object[] { str });
});
}
private void btnSuspend_Click(object sender, EventArgs e)
{
this.btnSuspend.Enabled = false;
this.btnResume.Enabled = true;
this.suspend = true;
manualResetEvent.Reset();
}
private void SafeInvoke(string s)
{
while (true)
{
if (formClosed)
return;
Thread.Sleep(200);
if (suspend)
this.auto.WaitOne();
this.txtMessageBox.AppendText(s);
}
}
private void SafeInvoke()
{
while (true)
{
if (formClosed)
return;
Thread.Sleep(200);
if (suspend)
//this.auto.WaitOne();
manualResetEvent.WaitOne();
asyncOperation.Post(delegate
{
this.txtMessageBox.AppendText(str);
}, str);
}
}
private void btnResume_Click(object sender, EventArgs e)
{
this.btnResume.Enabled = false;
this.btnSuspend.Enabled = true;
this.suspend = false;
//this.auto.Set();
manualResetEvent.Set();
}
}
}
由于看不到你的代码,所以看不出问题所在.
可以给你一个参考的示例:
C#线程暂停与开启
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;
namespace AutoResetEventTest
{
public partial class Form1 : Form
{
private ManualResetEvent manualResetEvent;
private AutoResetEvent auto;
private bool suspend;
private AsyncOperation asyncOperation;
public delegate void InvokeDelegate(string str);
private InvokeDelegate invokeDelegate;
const string str = "Test";
private bool formClosed;
public Form1()
{
InitializeComponent();
manualResetEvent = new ManualResetEvent(false);
auto = new AutoResetEvent(true);
asyncOperation = AsyncOperationManager.CreateOperation(null);
invokeDelegate = new InvokeDelegate(this.SafeInvoke);
this.FormClosed += delegate
{
this.formClosed = true;
this.auto.Close();
};
}
private void btnStart_Click(object sender, EventArgs e)
{
this.btnStart.Enabled = false;
this.btnSuspend.Enabled = true;
ThreadPool.QueueUserWorkItem(delegate
{
SafeInvoke();
//this.BeginInvoke(invokeDelegate, new object[] { str });
});
}
private void btnSuspend_Click(object sender, EventArgs e)
{
this.btnSuspend.Enabled = false;
this.btnResume.Enabled = true;
this.suspend = true;
manualResetEvent.Reset();
}
private void SafeInvoke(string s)
{
while (true)
{
if (formClosed)
return;
Thread.Sleep(200);
if (suspend)
this.auto.WaitOne();
this.txtMessageBox.AppendText(s);
}
}
private void SafeInvoke()
{
while (true)
{
if (formClosed)
return;
Thread.Sleep(200);
if (suspend)
//this.auto.WaitOne();
manualResetEvent.WaitOne();
asyncOperation.Post(delegate
{
this.txtMessageBox.AppendText(str);
}, str);
}
}
private void btnResume_Click(object sender, EventArgs e)
{
this.btnResume.Enabled = false;
this.btnSuspend.Enabled = true;
this.suspend = false;
//this.auto.Set();
manualResetEvent.Set();
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的this.Test_thing();位于main()
因而...Thread.Sleep(8000);...执行于main() 所处的线程,这里Thread代表的是主线程,所以sleep的是主线程
改成newThread.sleep(1000)就行了,
或者到StartWork里面去执行Thread.sleep(1000)。
因而...Thread.Sleep(8000);...执行于main() 所处的线程,这里Thread代表的是主线程,所以sleep的是主线程
改成newThread.sleep(1000)就行了,
或者到StartWork里面去执行Thread.sleep(1000)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
thread th = new thread(new threadstart(test));
th.start();
void test()
{
for(int i=0;i<100;i++){
thread.sleep(50);//当前线程(你所谓的子线程)休息50毫秒
console.writeline(i);
}
}
th.start();
void test()
{
for(int i=0;i<100;i++){
thread.sleep(50);//当前线程(你所谓的子线程)休息50毫秒
console.writeline(i);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C#中sleep和wait的区别。分享给大家供大家参考。具体分析如下:
sleep和wait都是使线程暂时停止执行的方法,但它们有很大的不同。
①. sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置。
而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,必须放在同步方法或同步块里。
②. Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。
而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
③. 线程执行wait方法时,需要另一个线程调用notify进行唤醒。
而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。
sleep和wait都是使线程暂时停止执行的方法,但它们有很大的不同。
①. sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置。
而wait是Object类的方法,它是使当前线程暂时放弃对象的使用权进行等待,必须放在同步方法或同步块里。
②. Sleep使用的时候,线程并不会放弃对象的使用权,即不会释放对象锁,所以在同步方法或同步块中使用sleep,一个线程访问时,其他的线程也是无法访问的。
而wait是会释放对象锁的,就是当前线程放弃对象的使用权,让其他的线程可以访问。
③. 线程执行wait方法时,需要另一个线程调用notify进行唤醒。
而sleep只是暂时休眠一定时间,时间到了之后,自动恢复运行,不需另外的线程唤醒。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询