AsyncCallbackとIAsyncResultを使用したコールバックパターンに関する2つの質問。
コード例で質問を変更しました:
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);
}
編集
を開始私は何が起こっているのかを見始めています。WCF非同期パターンと通常の非同期パターンを混同しました。WCFでは、プロキシを使用し、Begin-およびEndMethodには、関数デリゲートではなくプロキシを渡す必要があります。WCFの場合、キャストは機能しますが、通常の場合は機能しません。WCFは、[OperationContract(AsyncPattern = true)]属性を使用して、おそらく多少異なるパターンを適用します。編集終了
なぜ回線にエラーがあるのreturn (string)(result.AsyncState);
ですか?
本番コードとまったく同じパターンで問題ありません。
次に、クラスTestのBeginMethodでコードをデバッグできないのはなぜですか?
私はWorkerFunctionでしか中断できません。