Как создать IAsyncResult, который сразу завершается? - PullRequest
7 голосов
/ 18 февраля 2011

Я реализую интерфейс, который требует реализации методов BeginDoSomething и EndDoSomething. Однако мой DoSomething не очень долго. Для простоты предположим, что DoSomething сравнивает только две переменные и возвращает значение a> b

Так что мой BeginDoSomething должен выглядеть так:

protected override IAsyncResult BeginDoSomething(int a, int b, AsyncCallback callback, object state)
{
     bool returnValue = a > b;
     return ...; //what should I return here?  
     //The method actually already completed and I don't need to wait for anything
 }

Я не знаю, что мне вернуть. Я реализую BeginDoSomething только потому, что должен, а не потому, что мой метод работает долго. Должен ли я реализовать свой собственный IAsyncResult? Есть ли реализация в библиотеках .NET?

Ответы [ 2 ]

5 голосов
/ 18 февраля 2011

Быстрый способ сделать это - использовать делегата:

protected override IAsyncResult BeginDoSomething(int a, int b, AsyncCallback callback, object state)
{
     bool returnValue = a > b;
     Func<int,int,bool> func = (x,y) => x > y;
     return func.BeginInvoke(a,b,callback,state);
}

Недостатком этого подхода является то, что вам нужно быть осторожным, если два потока будут вызывать этот метод одновременно, вы будетеполучить ошибку.

5 голосов
/ 18 февраля 2011

Это немного быстро и грязно, но вы можете реализовать класс, который реализует IAsyncResult, вот так:

    public class MyAsyncResult : IAsyncResult
    {
        bool _result;

        public MyAsyncResult(bool result)
        {
            _result = result;
        }

        public bool IsCompleted
        {
            get { return true; }
        }

        public WaitHandle AsyncWaitHandle
        {
            get { throw new NotImplementedException(); }
        }

        public object AsyncState
        {
            get { return _result; }
        }

        public bool CompletedSynchronously
        {
            get { return true; }
        }
    }

Затем используйте его в своем BeginDoSomething так:

    return new MyAsyncResult(a > b);
...