10

BeginDoSomethingとメソッドの実装を必要とするインターフェースを実装していますEndDoSomething。しかし、私DoSomethingは本当に長期的ではありません。簡単にするためDoSomethingに、2つの変数のみを比較し、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ライブラリにすでに実装がありますか?

4

4 に答える 4

6

これは少し速くて汚いですが、次のように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);
于 2011-02-18T04:08:22.290 に答える
6

それを行う簡単なハック方法は、デリゲートを使用することです。

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

このアプローチの欠点は、2つのスレッドがこのメソッドを同時に呼び出す場合、エラーが発生することに注意する必要があることです。

于 2011-02-18T04:14:31.100 に答える