2015-08-12 2 views
0

У меня есть метод со следующей сигнатурой, принадлежащей классу.Как использовать IAsyncResult

public virtual IAsyncResult DoSomething(CustomOptions options); 

Я пытаюсь выяснить, как именно я называю callback.I не могу найти где-нибудь событие, на котором, чтобы дать метод обратного вызова.

+0

Может быть, авторы забыли включить обратный вызов: это будет параметр метода возвращения 'IAsyncResult'. – Richard

ответ

1

Это скопировано в значительной степени из MSDN:

// Initiate the asychronous call. 
    IAsyncResult result = caller.BeginInvoke(3000, 
     out threadId, null, null); 

    Thread.Sleep(0); 
    Console.WriteLine("Main thread {0} does some work.", 
     Thread.CurrentThread.ManagedThreadId); 

    // Wait for the WaitHandle to become signaled. 
    result.AsyncWaitHandle.WaitOne(); 

    // Perform additional processing here. 
    // Call EndInvoke to retrieve the results. 
    string returnValue = caller.EndInvoke(out threadId, result); 

Если метод самостоятельно, вы можете попробовать возвращающая задачу, которая будет иметь метод ContinueWith, который принимает блок кода (Другой Задача) в качестве обратного вызова, который будет запускаться после завершения Задачи.

0

Чтобы понять, как использовать IAsyncResult, вы должны понять, где он будет использоваться. Обычно он используется для асинхронного вызова. Наиболее часто используемым является аферитный вызов делегата. В этом случае IAsyncResult является квитанцией, она используется как «носитель информации» и предоставляет объект синхронизации, чтобы прервать поток при завершении асинхронной операции.

Обычно вам не нужно создавать IAsyncResult. IAsyncResult - это просто способ реализации функции получения. Вы не можете сделать это настолько сложным. Просто передайте простую структуру, чтобы нести нужные вам данные.

нравится:

/// <summary> 
/// This is a simplified IAsyncResult 
/// </summary> 
public class Receipt 
{ 
    /// <summary> 
    /// Name 
    /// </summary> 
    public String Name 
    { 
     get; 
     set; 
    } 

    /// <summary> 
    /// Age 
    /// </summary> 
    public Byte Age 
    { 
     get; 
     set; 
    } 

    public String OperationResultText 
    { 
     get; 
     set; 
    } 
} 

public class Test 
{ 
    public delegate void Async_OperationCallbackHandler(Receipt r); 

    public void MainEntry() 
    { 
     Thread tmpThread = new Thread(()=> 
     { 
      Async_Operation("ASDF", 20, Async_Operation_Callback); 
     }); 

     tmpThread.Start(); 
    } 

    public void Async_Operation(String name, Byte age, Async_OperationCallbackHandler callback) 
    { 
     //Do something with "name" and "age" and get result... 
     String result = "OK..."; 

     Receipt r = new Receipt() 
     { 
       Age = age, 
       Name = name, 
       OperationResultText = result 
     }; 

     callback(r); 
    } 

    internal void Async_Operation_Callback(Receipt r) 
    { 
     Console.WriteLine("Name = " + r.Name + ", Age = " + r.Age + ", Operation result: " + r.OperationResultText); 
    } 
} 

Конечно, я не считал синхронизацию. Но .NET Framework взяла на себя это. Поэтому определите содержимое квитанции в соответствии с вашими потребностями, не нужно использовать IAsyncResult.

См:

Calling Synchronous Methods Asynchronously

IAsyncResult Interface

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