Реализация асинхронного метода - PullRequest
0 голосов
/ 13 мая 2009

Я хочу реализовать синхронную и асинхронную версию метода в библиотеке классов. В настоящее время я сделал это так, чтобы метод Async запускал новый поток и выполнял его обработку. Чтобы определить, завершено ли действие, пользователь должен опросить свойство, чтобы узнать, завершилось ли оно.

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

Ответы [ 3 ]

6 голосов
/ 13 мая 2009
public static void Queue(Action action, Action done) {
    ThreadPool.QueueUserWorkItem(_ =>
    {
        try {
            action();
        } 
        catch (ThreadAbortException) { /* dont report on this */ } 
        catch (Exception ex) {
            Debug.Assert(false, "Async thread crashed! This must be fixed. " + ex.ToString());
        }
        // note: this will not be called if the thread is aborted
        if (done != null) done();
    });
}

Использование:

    Queue( () => { Console.WriteLine("doing work"); }, 
           () => { Console.WriteLine("work was done!"); } );
2 голосов
/ 09 июля 2009

Вы можете использовать метод обратного вызова вместо опроса. Проверьте мой ответ на AsyncCallback

Отредактировано:

Пример FileCopy с использованием собственных асинхронных делегатов с обратным вызовом:

    public class AsyncFileCopier
    {
        public delegate void FileCopyDelegate(string sourceFile, string destFile);

        public static void AsynFileCopy(string sourceFile, string destFile)
        {
            FileCopyDelegate del = new FileCopyDelegate(FileCopy);
            IAsyncResult result = del.BeginInvoke(sourceFile, destFile, CallBackAfterFileCopied, null);
        }

        public static void FileCopy(string sourceFile, string destFile)
        { 
            // Code to copy the file
        }

        public static void CallBackAfterFileCopied(IAsyncResult result)
        {
            // Code to be run after file copy is done
        }
    }

Вы можете назвать это как:

AsyncFileCopier.AsynFileCopy("abc.txt", "xyz.txt");
0 голосов
/ 13 мая 2009

Асинхронные делегаты могут быть другим вариантом.

Подробнее о Асинхронное программирование с использованием делегатов в MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...