Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# compact framework上线程的异步回调_C#_.net_Multithreading_Compact Framework_Asynchronous - Fatal编程技术网

C# compact framework上线程的异步回调

C# compact framework上线程的异步回调,c#,.net,multithreading,compact-framework,asynchronous,C#,.net,Multithreading,Compact Framework,Asynchronous,我需要在一个紧凑的框架应用程序中实现线程以缩短加载时间。我想启动一个后台线程来调用外部API,而主线程缓存一些表单。后台线程完成后,我需要再启动两个线程来填充数据缓存 我需要后台线程能够执行回调方法,这样我就知道它已经完成,接下来的两个线程可以启动,但是紧凑框架不支持委托上的BeginInvoke方法,所以我还可以怎么做呢?你可以自己安排,只要确保你的线程方法调用一个完成的方法(或事件)完成后 因为CF也不支持ParameterizedThreadStart,所以我曾经创建了一个小助手类 以下为

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


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

你可以自己安排,只要确保你的线程方法调用一个完成的方法(或事件)完成后

因为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属性使用可能是有意义的,只是注意到了。

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

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

这样可以吗?我不是线程专家,但我担心从一个线程中产生新的线程,这在这里肯定会发生?是的,但是从一个线程开始一个线程没有什么特别的。你的主线程也是一个线程。不得不挖掘和调整一些遗留代码,偶然发现了这个答案-感谢优雅的解决方案!