Реализация обратного вызова в WP7 C # - PullRequest
0 голосов
/ 28 мая 2011

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

В основном, мой вопрос: какой тип нужно передать конструктору класса?

1 Ответ

4 голосов
/ 28 мая 2011

В C # (не только в WP7) вы можете вызывать любую функцию асинхронно, заключая ее в делегат. При вызове делегата BeginInvoke вы передадите обратный вызов, который будет вызван после завершения операции. Смотрите пример ниже:

int MyLongOperation(int x, int y) {
   Thread.Sleep(10000);
   return x+y;
}

void CallingLongOperation(){
   int x = 4;
   int y = 5;
   Func<int, int, int> func = MyLongOperation;
   func.BeginInvoke(x, y, OperationCallback, func);
}

void OperationCallback(IAsyncResult asyncResult) {
   Func<int, int, int> func = (Func<int, int, int>) asyncResult.AsyncState;
   int result = func.EndInvoke(asyncResult);
   // do something with the result
}

Если вам нужно передать какой-то дополнительный параметр в свойство asyncState / userState, вы также можете использовать свойство AsyncDelegate параметра IAsyncResult (который для вызовов делегатов всегда System.Runtime.Remoting.Messaging.AsyncResult) и получить делегат оттуда, как показано ниже.

public int MyLongOperation(int x, int y)
{
    Thread.Sleep(10000);
    return x + y;
}
public void CallLongOperation()
{
    Func<int, int, int> func = MyLongOperation;
    func.BeginInvoke(5, 7, MyCallback, "Expected result: " + 12);
    Console.WriteLine("Called BeginInvoke");
    func.BeginInvoke(11, 22, MyCallback, "Expected result: " + 33);
    Console.WriteLine("Press ENTER to continue");
    Console.ReadLine();
}
void MyCallback(IAsyncResult asyncResult)
{
    Func<int, int, int> func = (Func<int, int, int>)((System.Runtime.Remoting.Messaging.AsyncResult)asyncResult).AsyncDelegate;
    string expectedResult = (string)asyncResult.AsyncState;
    int result = func.EndInvoke(asyncResult);
    Console.WriteLine("Result: {0} - {1}", result, expectedResult);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...