AsyncCallback для потока на компактной основе - PullRequest
3 голосов
/ 30 июня 2009

Мне нужно реализовать многопоточность, чтобы улучшить время загрузки в компактном фреймворковом приложении. Я хочу запустить фоновый поток для выполнения некоторых вызовов внешнего API, в то время как основной поток кэширует некоторые формы. Когда фоновый поток завершен, мне нужно запустить еще два потока, чтобы заполнить кэш данных.

Мне нужен фоновый поток, чтобы иметь возможность выполнить метод обратного вызова, чтобы я знал, что он выполнен, и следующие два потока могут быть запущены, но метод BeginInvoke для делегата не поддерживается в компактной среде, так как еще можно сделать это?

Ответы [ 2 ]

3 голосов
/ 30 июня 2009

Вы можете сделать это самостоятельно, просто убедитесь, что ваш метод потока вызывает завершенный метод (или событие), когда это будет сделано.

Поскольку 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, просто заметил это.

1 голос
/ 16 апреля 2013

Я знаю, что это старый вопрос, но если вы используете CF 3.5, это было бы хорошим кратким решением проблемы. Использование лямбда-делегата ..

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