带有回调示例的线程不起作用。

Posted

技术标签:

【中文标题】带有回调示例的线程不起作用。【英文标题】:Threading with Callback example does not work. 【发布时间】:2012-02-15 23:09:12 【问题描述】:

我正在处理这个示例,但我无法对回调和线程进行网格划分。 我想要的是这个。 1) 按下按钮 2)启动进度条运行 3) 调用一个新线程来执行一些长时间运行的进程 4) 长时间运行的进程回调应该会触发进度条停止。

下面我有一些东西......虽然 DoSomethingInThread 的回调参数以 null 形式出现。 StopProgressBar() 作用于 ProgressBar 控件,所以它不能是静态的。

    static bool done;
    static readonly object locker = new object();
    static ParameterizedThreadStart threadStarter = new ParameterizedThreadStart(DoSomethingInThread);  
    private Thread workerThread = new Thread(threadStarter);
    public delegate void StopProgressBarCallback()

    public Form1()
    
        InitializeComponent();
    

    private void button1_Click(object sender, EventArgs e)
    
        StartProgressBar();
        workerThread.Start();
    

    static void DoSomethingInThread(object callback)
    
        StopProgressBarCallback stopper = callback as StopProgressBarCallback;
        lock (locker)
        
            Thread.Sleep(5 * 1000);
        
        stopper();
    

    private void StartProgressBar()
    
        progressBar1.MarqueeAnimationSpeed = 30;
        progressBar1.Style = ProgressBarStyle.Marquee;
    

    public void StopProgressBar()
    
        progressBar1.Style = ProgressBarStyle.Continuous;
    

【问题讨论】:

【参考方案1】:

看看backgroundworker 类,它更适合你想做的事情,而且更容易掌握!

一般来说,您永远不应该“更新” Thread 实例。最好使用thread pool,一个后台工作者,或者如果你在.net 4上,使用线程并行库中的task对象。

【讨论】:

BackgroundWorker 类非常简单,第一次就可以使用。感谢您的建议。

以上是关于带有回调示例的线程不起作用。的主要内容,如果未能解决你的问题,请参考以下文章

回调函数不起作用 多线程调试 (/MTd)

使用由`fork`创建的多个C线程的回调函数时,Rust Mutex不起作用

Swift 回调不起作用

动画在 api 响应成功回调中不起作用

为啥我的带有关联的简单 ExtJS 数据示例不起作用?

带有棘轮的 PHP WebSockets - 示例不起作用