В 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);
}