Pergunta

Estou implementando uma interface que requer implementações de BeginDoSomething e EndDoSomething métodos.No entanto, meu DoSomething não é realmente de longa duração.Para simplificar, suponha DoSomething compara apenas duas variáveis ​​e retorna se a > b

Então meu BeginDoSomething deveria ser assim:

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
 }

Não sei o que devo devolver.Eu só implemento BeginDoSomething porque preciso, não porque meu método seja de longa duração.Preciso implementar meu próprio IAsyncResult?Já existe uma implementação em bibliotecas .NET?

Foi útil?

Solução

A maneira rápida de fazer isso é usar um delegado:

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);
}

A desvantagem dessa abordagem é que você precisa ter cuidado se dois threads chamarem esse método simultaneamente, você receberá um erro.

Outras dicas

Isso é um pouco rápido e sujo, mas você pode implementar uma classe que implemente IAsyncResult assim:

    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; }
        }
    }

Em seguida, use-o em seu BeginDoAlgo assim:

    return new MyAsyncResult(a > b);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top