【问题标题】:AsyncCallback for a thread on compact framework紧凑框架上的线程的 AsyncCallback
【发布时间】:2009-06-30 11:32:19
【问题描述】:

我需要在一个紧凑的框架应用程序中实现线程以缩短加载时间。我想启动一个后台线程来对外部 API 进行一些调用,而主线程缓存一些表单。后台线程完成后,我需要再启动两个线程来填充数据缓存。

我需要后台线程能够执行回调方法,所以我知道它已经完成并且可以启动接下来的两个线程,但是紧凑框架中不支持委托上的 BeginInvoke 方法,所以我还能怎么做这样做?

【问题讨论】:

    标签: c# .net multithreading compact-framework asynchronous


    【解决方案1】:

    您可以自己安排,只需确保您的线程方法在完成时调用已完成的方法(或事件)。

    由于 CF 也不支持 ParameterizedThreadStart,我曾经做了一个小助手类。

    以下为摘录,未经重新测试:

    //untested
    public abstract class BgHelper
    {
        public System.Exception Error { get; private set; }
        public System.Object State { get; private set; }
    
        public void RunMe(object state)
        {
            this.State = state;
            this.Error = null;
    
            ThreadStart starter = new ThreadStart(Run);
            Thread t = new Thread(starter);
            t.Start();            
        }
    
        private void Run()
        {
            try
            {
                DoWork();                
            }
            catch (Exception ex)
            {
                Error = ex;
            }
            Completed(); // should check Error first
        }
    
        protected abstract void DoWork() ;
    
        protected abstract void Completed();
    }
    

    您需要继承和实现 DoWork 和 Completed。对 State 属性使用 可能是有意义的,只是注意到了这一点。

    【讨论】:

    • 这样可以吗?我不是线程专家,但我担心从线程中产生新线程,这肯定会在这里发生吗?
    • 是的,但是从一个线程开始一个线程并没有什么特别之处。你的主线程也是一个线程。
    【解决方案2】:

    我知道这是一个老问题,但如果您使用的是 CF 3.5,这将是一个很好的简短解决方案。使用 lambda 委托..

    ThreadStart starter = () => DoWorkMethodWithParams( param1, param2);
    Thread myNewThread = new Thread(starter){IsBackground = true};
    myNewThread.Start();
    

    【讨论】:

    • 不得不挖掘并调整一些遗留代码,偶然发现了这个答案 - 感谢优雅的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多