按理说多线程界面不会有卡的现,因为是两个线程,新开的线程和UI线程不是一个线程,跨线程访问UI会出现问题,所以很可能出现在更新UI的语句上。
解决方案 »
- 求助一个关于遍历的问题
- aspx项目,如何实现只更新网页的一部分?
- tab键问题
- C# RelatedObjects 问题?~在线等.万谢.
- [麻烦一下大家]此 SqlParameterCollection 中未包含带有 ParameterName“@username”的 SqlParameter。
- 如何制作搜索功能
- 关于iewebcontrol treeview的使用
- ImageButton 需要点击两次才触动ImageButton1_Click 事件?!!奇怪的问题~救命啊
- 请教大家,一个关于 高并发性,高传输可靠性,高执行效率 的解决方案.
- 请问如何判断一个隐藏的窗体是否存在?
- c#
- 路过的大神帮我看下这么样才能再listview里面实现点击网址就能打开网页
捕获你的子线程中的程序抛出的异常。debug和release编程是不一样的。debug需要即时调试,而release需要容错,因此代码不一样。你做到了吗?
把这个方法定义成委托的调用,用控件的invoke去调用委托 实现方法 试试吧
public class MyForm : System.Windows.Forms.Form {
//UI 元素
private Label lblStatus;
private ProgressBar progressBar1; //Delegate
private delegate void MyProgressEventsHandler(
object sender, MyProgressEvents e);
private void UpdateUI(object sender, MyProgressEvents e) {
lblStatus.Text = e.Msg;
myProgressControl.Value = e.PercentDone;
} //ShowProgress 现在可以记录为可从任何线程调用的公共方法。
public void ShowProgress(string msg, int percentDone)
{
if(InvokeRequired)
{
System.EventArgs e = new MyProgressEvents(msg, percentDone);
object[] pList = { this, e }; BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);
}
else
{
UpdateUI(this, new MyProgressEvents(msg,
PercentDone));
}
} private void btnStart_Click(object sender, EventArgs e)
{
//启动线程
Thread t = new Thread(new ParameterizedThreadStart(RunsOnWorkerThread));
t.IsBackground = true;
t.Start(input);
} //线程执行函数
private void RunsOnWorkerThread()
{
int i = 0;
while(...) //loop
{
DoSomethingSlow();
ShowProgress("test",i);
++i;
}
}
}