C# winform 多线程 求助啊 我小白 555

ruirui0713 2012-08-01 10:50:25
我想程序暂停几秒运行 并且界面不卡怎么搞啊 求助 小白 企鹅 470236189
...全文
266 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xboxeer 2012-08-02
  • 打赏
  • 举报
回复


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace csdnWinform
{
public partial class Form1 : Form
{
private int _sleepCount = 0;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//非UI线程执行耗时操作(这里是更新UI上的Label 显示当前精确时间)
var timeThread = new Thread(() =>
{
while (true)
{
//休眠1秒 模拟操作 这里相当于秒表
Thread.Sleep(1000);
//这里是外部定义的线程休眠时间 默认情况下_sleepCount为0 所以会忽略这个停顿
Thread.Sleep(this._sleepCount);
//重置线程休眠时间
this._sleepCount = 0;
if (label1.InvokeRequired)
{
this.Invoke(new Action(() => this.label1.Text = DateTime.Now.ToString()));
}
else
{
this.label1.Text = DateTime.Now.ToString();
}
}
});
timeThread.IsBackground = true;
timeThread.Start();
}

private void button1_Click(object sender, EventArgs e)
{
int sleepCount = 0;
if (!int.TryParse(textBox1.Text,out sleepCount))
{
MessageBox.Show("Sleep Count Illeadge");
return;
}
//修改全局_sleepCount变量 这样在任务线程里面也就会有指定时间的休眠
_sleepCount = sleepCount * 1000;
}
}
}

yezhendong185 2012-08-02
  • 打赏
  • 举报
回复

新的一个线程。
Thread th = new Thread(new ParameterizedThreadStart(start));
th.Start();

在线程方法里面悬停线程。
private static void start(object _obj)
{
Thread.Sleep(1000);
}
ruirui0713 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

仅仅是让程序暂停几秒,而且不影响界面响应速度的话,不需要用到多线程。
在需要暂停的地方插入以下代码:
DataTime t=DataTime.Now;
while((DataTime.Now-t)<TimeSpan.FromSeconds(5))//程序在此处暂停5秒
{
Application.DoEvents();
}
[/Quote]

哥哥哥哥 你是哥 就是我想要的效果 简单明了 谢谢
timelight2000 2012-08-02
  • 打赏
  • 举报
回复
仅仅是让程序暂停几秒,而且不影响界面响应速度的话,不需要用到多线程。
在需要暂停的地方插入以下代码:
DataTime t=DataTime.Now;
while((DataTime.Now-t)<TimeSpan.FromSeconds(5))//程序在此处暂停5秒
{
Application.DoEvents();
}
猴头 2012-08-02
  • 打赏
  • 举报
回复
我觉得在这句话:

this.Invoke(new Action(() => this.label1.Text = DateTime.Now.ToString()));

改成:
this.Invoke(new MethodInvoke( new Action(() => this.label1.Text = DateTime.Now.ToString())));
好一些,以为我以前有一次写程序的时候,没加MethodInvoke这个,发现Action执行完了之后,跳转到一个不应该在此时跳转到的地方,这是什么原因我也不知道,而且是过几次 都是这样,加了MethodInvoke之后执行才正常,听某人告诉我,这是加一个什么线程通讯的“通道”什么的,具体叫什么我也记不清楚了,后来想查也没找到合适的说明。


[Quote=引用 12 楼 的回复:]
C# code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ……
[/Quote]
ruirui0713 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

需求可以发我邮箱或者站内信
引用 7 楼 的回复:

引用 6 楼 的回复:

图方便的话可以用backgroundworker这个类 不过我不知道他是不是有对应的线程阻塞方法 我个人感觉他就是微软封装好了的一个线程组件
如果想从头自己来 那你先问问自己委托理解了没 多线程理解了没 同步访问 异步访问理解了没
引用 5 楼 的回复:

引用 4 楼 的回复:

如果……
[/Quote]
发了 站内信
ruirui0713 2012-08-01
  • 打赏
  • 举报
回复
哎 我小白 大家理解下吧 求求大家帮帮忙
  • 打赏
  • 举报
回复
说话太含糊了吧.....
xboxeer 2012-08-01
  • 打赏
  • 举报
回复
需求可以发我邮箱或者站内信
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

图方便的话可以用backgroundworker这个类 不过我不知道他是不是有对应的线程阻塞方法 我个人感觉他就是微软封装好了的一个线程组件
如果想从头自己来 那你先问问自己委托理解了没 多线程理解了没 同步访问 异步访问理解了没
引用 5 楼 的回复:

引用 4 楼 的回复:

如果你是想在winform里面跑个for循环 然后每次循环都sle……
[/Quote]
ruirui0713 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

图方便的话可以用backgroundworker这个类 不过我不知道他是不是有对应的线程阻塞方法 我个人感觉他就是微软封装好了的一个线程组件
如果想从头自己来 那你先问问自己委托理解了没 多线程理解了没 同步访问 异步访问理解了没
引用 5 楼 的回复:

引用 4 楼 的回复:

如果你是想在winform里面跑个for循环 然后每次循环都sleep一下 那么抱歉 UI线程阻……
[/Quote]
不懂啊 你能不能加我企鹅 470236189 帮我看看我程序 做个demo学习学习
xboxeer 2012-08-01
  • 打赏
  • 举报
回复
图方便的话可以用backgroundworker这个类 不过我不知道他是不是有对应的线程阻塞方法 我个人感觉他就是微软封装好了的一个线程组件
如果想从头自己来 那你先问问自己委托理解了没 多线程理解了没 同步访问 异步访问理解了没
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

如果你是想在winform里面跑个for循环 然后每次循环都sleep一下 那么抱歉 UI线程阻塞 你的界面必然卡死
你要做的是将你的任务分配给另一个线程(非UI线程)去做 然后再在里面调用sleep或者别的方式去阻塞你这个执行任务的线程
任何时候都不要让UI线程等待

就是不知道如何实现。。。。。。小白啊
[/Quote]
ruirui0713 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

如果你是想在winform里面跑个for循环 然后每次循环都sleep一下 那么抱歉 UI线程阻塞 你的界面必然卡死
你要做的是将你的任务分配给另一个线程(非UI线程)去做 然后再在里面调用sleep或者别的方式去阻塞你这个执行任务的线程
任何时候都不要让UI线程等待
[/Quote]
就是不知道如何实现。。。。。。小白啊
xboxeer 2012-08-01
  • 打赏
  • 举报
回复
如果你是想在winform里面跑个for循环 然后每次循环都sleep一下 那么抱歉 UI线程阻塞 你的界面必然卡死
你要做的是将你的任务分配给另一个线程(非UI线程)去做 然后再在里面调用sleep或者别的方式去阻塞你这个执行任务的线程
任何时候都不要让UI线程等待
ruirui0713 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

什么叫暂停几秒运行?是指点击之后,几秒后才处理数据,显示结果?
直接创建一个新线程,sleep一下不就行了吗?
[/Quote]
是啊 但是我不懂啊 教教我好吗 加我企鹅吧 470236189
CodeFriends 2012-08-01
  • 打赏
  • 举报
回复
蛋疼的问题!!!
moonson0618 2012-08-01
  • 打赏
  • 举报
回复
什么叫暂停几秒运行?是指点击之后,几秒后才处理数据,显示结果?
直接创建一个新线程,sleep一下不就行了吗?

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧