C# 如何让一个自定义控件在该控件的内部调用函数,使其在一个子线程中运行? 100
我做了一个自定义的进度条控件,有两个函数控制它开始和关闭,Start()和Stop()。在主窗体中使用的时候,newProgressBar().Start(),主窗体下面...
我做了一个自定义的进度条控件,有两个函数控制它开始和关闭,Start()和Stop()。在主窗体中使用的时候,new ProgressBar().Start(),主窗体下面会有一个非常耗时的操作,这导致了进度条界面卡死了。这是因为进度条和主窗体在一个线程里面执行,所以,我的目的就是,让这个ProgressBar在一个单独的托管线程里执行,使得进度条和主窗体可以独立运行。同时,不要在外部生成线程来执行这个进度条,而是每次启动这个进度条,它自己自动的在另外一个托管线程里面执行。
下面的两种方式我都试过了,不行。
private void run()
{
// 方式1.
myProgressBar.ProgressBar myProgress
= new myProgressBar.ProgressBar myProgress();
myProgress.Start();
// 下面的方式,方式2
MethodInvoker invoker = delegat()
{
myProgressBar.ProgressBar myProgress
= new myProgressBar.ProgressBar myProgress();
myProgress.Start();
};
this.BeginInvoke(invoker);
}
// 主窗体中的方法
Thread thd = new Thread(run);
thd.Start();
// 下面执行耗时的操作 展开
下面的两种方式我都试过了,不行。
private void run()
{
// 方式1.
myProgressBar.ProgressBar myProgress
= new myProgressBar.ProgressBar myProgress();
myProgress.Start();
// 下面的方式,方式2
MethodInvoker invoker = delegat()
{
myProgressBar.ProgressBar myProgress
= new myProgressBar.ProgressBar myProgress();
myProgress.Start();
};
this.BeginInvoke(invoker);
}
// 主窗体中的方法
Thread thd = new Thread(run);
thd.Start();
// 下面执行耗时的操作 展开
2个回答
展开全部
public interface IProgressBarWork
{
void beginWork();
void doWork();
void endWork();
}
public class ProgressBarWorkImpl : IProgressBarWork
{
private int i;
public void beginWork() { i = 0; }
public int doWork() { return i++; }
public void endWork() {}
}
public class MyProgressBar : UserControl
{
private IProgressBarWork work;
private Thread t;
public setWork(IProgressBarWork pwork)
{
work = pwork;
}
public void Start()
{
if(work != null)
{
t = new Thread(run);
t.Start();
}
}
private void run()
{
try{
work.beginWork();
while(true)
{
进度条的值 = work.doWork();//这里用委托去修改进度条的值,只有主线程才能访问UI界面的内容
if(进度条的值满了)
break;
Thread.Sleep(10);
}
}catch(Exception e){}
finally
{
work.endWork();
}
}
public void Stop()
{
if(t!=null)
{
t.Interrupt();
}
}
}
提供一种思路,用委托也可以,按自己需求改改
更多追问追答
追问
非常感谢,我试试啊。
追答
//改进版
public interface IProgressBarWork
{
void beginWork();
IEnumerable doWork();
void endWork();
}
public class ProgressBarWorkImpl : IProgressBarWork
{
public void beginWork() { i = 0; }
public IEnumerable doWork() {
//处理了百分一的工作
yield return 1;
//处理了百分10的工作
yield return 10;
}
public void endWork() {}
}
run中的循环改为
foreach (int i in doWork())
{
委托修改进度条的值;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询