2009-05-13 2 views
0

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

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

ответ

6
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!"); }); 
+0

Красивого метод , +1. –

2

Вы можете использовать метод обратного вызова вместо опроса. Проверьте мой ответ на 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

Действительно, однако при дальнейшем чтении вы просто используете метод FileStream.BeginRead(), который вызывает обратный вызов. Мне нужно написать свой собственный обратный вызов, хотя я полагаю, что это может быть случай передачи делегату, который будет использоваться для запуска события позже ... – Ian

+0

Вы можете использовать асинхронные делегаты и выполнить BeginInvoke, чтобы указать свой собственный Перезвони. –

Смежные вопросы