Два вопроса по шаблону обратного вызова с AsyncCallback и IAsyncResult.
Я изменил вопрос с помощью примера кода:
using System;
using System.Collections.Generic;
using System.Text;
namespace TestAsync
{
class Program
{
private static Wrapper test = new Wrapper();
static void Main(string[] args)
{
test.BeginMethod("parameter 1", "parameter 2", Callback);
Console.ReadKey();
}
private static void Callback(IAsyncResult ar)
{
string result = test.EndMethod(ar);
}
}
public interface ITest
{
IAsyncResult BeginMethod(string s1, string s2, AsyncCallback cb, object state);
string EndMethod(IAsyncResult result);
}
public class Wrapper
{
private ITest proxy = new Test();
public void BeginMethod(string s1, string s2, AsyncCallback cb)
{
proxy.BeginMethod(s1, s2, cb, proxy);
}
public string EndMethod(IAsyncResult result)
{
return ((ITest)(result.AsyncState)).EndMethod(result);
}
}
public class Test : ITest
{
private string WorkerFunction(string a, string b)
{
// "long running work"
return a + "|" + b;
}
public IAsyncResult BeginMethod(string s1, string s2, AsyncCallback cb, object state)
{
Func<string, string, string> function = new Func<string, string, string>(WorkerFunction);
IAsyncResult result = function.BeginInvoke(s1, s2, cb, state);
return result;
}
public string EndMethod(IAsyncResult result)
{
return (string)(result.AsyncState);
}
}
public delegate TResult Func<T1, T2, TResult>(T1 t1, T2 t2);
}
BEGIN EDIT
Я начинаю понимать, что происходит.
Я перепутал асинхронный шаблон WCF и обычный асинхронный шаблон.
В WCF используется прокси, и Begin- и EndMethod должны передаваться прокси, а не делегату функции. В случае WCF литье работает, в обычном случае - нет.
WCF использует атрибут [OperationContract (AsyncPattern = true)], вероятно, для применения несколько другого шаблона.
КОНЕЦ РЕДАКТИРОВАНИЯ
Почему ошибка в строке return (string) (result.AsyncState);
?
Точно такой же шаблон в производственном коде можно.
Во-вторых, почему я не могу отладить код в BeginMethod класса Test?
Я могу только взломать WorkerFunction.