Como criar um IAsyncResult que seja concluído imediatamente?
-
15-11-2019 - |
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?
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);