Два вопроса о шаблоне AsyncCallback и IAsyncResult

Два вопроса по шаблону обратного вызова с 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.

15
задан Gerard 23 February 2011 в 15:00
поделиться