0

ManualResetEventを使用して、コールバックが実行されるまでブロックしようとしていますが、別のスレッドでコールバックを実行しようとしても、コールバックに到達しません。

waitHandle = new ManualResetEvent(false);

DataServiceQueryer<MyEntity> dataServiceQueryer = new DataServiceQueryer<MyEntity>(dsQuery.Expression);

ThreadPool.QueueUserWorkItem(new WaitCallback(stateInfo =>
{
    dataServiceQueryer.ExecuteQuery();
}));

// waits here forever
waitHandle.WaitOne();

public class DataServiceQueryer<T> 
{
    //field, properties

    public void ExecuteQuery()
    {
        // this block is definitely executed
        _asyncResult = _query.BeginExecute(new AsyncCallback(c =>
        {
            // this is never reached
            QueryOperationResponse<T> result = _query.EndExecute(c) as QueryOperationResponse<T>;
            MainPage.ListRecords = new ObservableCollection<T>(result) as ObservableCollectionEx<MyEntity>;
            MainPage.waitHandle.Set();
        }), _query);

        // neither is this!
        var test = _asyncResult.AsyncWaitHandle.WaitOne(0);
    }
}

助言がありますか?_asycResultなぜ割り当てが行われないように見えるのかについて、私は最も混乱しています。EF4とdevartOracledotConnectプロバイダーでSilverlight4を使用しています。

4

1 に答える 1

0

SilverlightおよびUIスレッドでは、これは予想される動作です(アプリがハングします)。過去に見たことを覚えていると断言できますが、これ以上の公式ドキュメントは見つからないようです...

正確な詳細は覚えていませんが、UIスレッドを直接ブロックすると、すべてが機能しなくなると確信しています。UIスレッドがネットワークIOを処理することを覚えているようです。

WaitOne呼び出しをコールバックに移動する必要がある後、何をしたいのか。

正確な状況ではありませんが、このリンクに関連情報があります。UIスレッドをブロックすると、UIメッセージングキューもブロックされるため、Webサービス呼び出しが送信されなくなることが説明されています。あなたの電話はスレッドプールから出ていると思います。それでもUIスレッドをブロックすると干渉すると思いますが、その理由を具体的に説明しているドキュメントを見つけることができません。

http://www.codeproject.com/Articles/31018/Synchronous-Web-Service-Calls-with-Silverlight-Dis(現時点で見つけることができる最善の方法です。自分の記事が見つかった場合は、更新します。探している)。

于 2012-05-04T23:24:21.890 に答える