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();
  // 下面执行耗时的操作
展开
 我来答
百度网友e2dbec6
2015-06-18 · TA获得超过273个赞
知道小有建树答主
回答量:367
采纳率:0%
帮助的人:254万
展开全部
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())
        {
            委托修改进度条的值;
        }
归天宇wB
2015-06-17
知道答主
回答量:91
采纳率:0%
帮助的人:18.7万
展开全部
有偿帮助需要吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式