c# 点击button以后怎样使form不假死
因为button点击事件,需要计算的量比较大,可能会卡死半小时左右。有没有什么办法使form不成假死的状态?可以加一个类似滚动的进度条什么的吗?...
因为button点击事件,需要计算的量比较大,可能会卡死半小时左右。有没有什么办法使form不成假死的状态?
可以加一个类似滚动的进度条什么的吗? 展开
可以加一个类似滚动的进度条什么的吗? 展开
5个回答
展开全部
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication1
{
struct Test
{
public event Action<int> OnStep;
public void Run()
{
for(int i=0;i<100;i++)
{
Thread.Sleep(1000);
if(null != OnStep)
{
OnStep(i);
}
}
}
}
class Program
{
static void Main(string[] args)
{
Test ts = new Test();
ts.OnStep += ts_OnStep;
Thread t = new Thread(new ThreadStart(ts.Run));
t.Start();
Console.ReadLine();
t.Abort();
}
static void ts_OnStep(int obj)
{
Console.WriteLine("current step:" + obj);
}
}
}
你把main函数修改为你的按钮事件就可以了,不过在ts_OnStep中,如果要修改界面的数据,需要这样使用,不然会有异常
this.Invoke(new MethodInvoker(() =>
{
TimeSpan arg3 = new TimeSpan(0, 0, Int32.Parse(musicInfoList[listBox1.SelectedIndex].time));
double second1 = arg1.TotalSeconds;
double second2 = arg3.TotalSeconds;
double millsec1 = arg1.TotalMilliseconds;
double millsec2 = arg3.TotalMilliseconds;
label2.Text = arg1.Minutes + ":" + arg1.Seconds + (arg1.Milliseconds / 1001.0).ToString(".0") + "/" + arg3.Minutes + ":" + arg3.Seconds;
int val =(int) (progressBar2.Maximum * millsec1 / millsec2);
if (val<progressBar2.Minimum||val>progressBar2.Maximum)
{
return;
}
progressBar2.Value = val;
}));
展开全部
在适当的位置加入Application.DoEvents(),释放一下CPU,然后再加入滚动条就更完美了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
创建一个线程,在线程里面操作,这样form就不会卡死
追问
我里面大概有两个for循环
你能大概说一下怎么用多线程吗?
我还没用过多线程。。。
追答
引入命名空间 using System.Threading;
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(NewMethod);
thread.IsBackground = true;
thread.Start();
}
private void NewMethod()
{
//处理代码,处理完后调用thread.Abort()终止线程
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只能用多线程了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为什么不考虑下用Jquery+一般处理程序呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询