Как создать iasyncresult, который немедленно завершается?
я реализую интерфейс, который требует реализации 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 ответов
быстрый способ взломать это-использовать делегат:
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);
}
недостатком этого подхода является то, что вам нужно быть осторожным, если два потока будут вызывать этот метод одновременно, вы получите ошибку.
Это немного быстро и грязно, но вы можете реализовать класс, который реализует 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);