关于 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)]属性可能是为了强制执行略有不同的模式。
END EDIT
为什么在return (string)(result.AsyncState);
行会出错?
在生产代码中完全相同的模式是没问题的。
其次,为什么我不能调试Test类的BeginMethod中的代码?
我只能在WorkerFunction中断点。
function.BeginInvoke(...
,而不是写成IAsyncResult result = function.BeginInvoke(...
吗? - Gerard