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任务似乎永远不会发生感到最困惑。我将 Silverlight 4 与 EF4 和 devart Oracle dotConnect 提供程序一起使用。

4

1 回答 1

0

在 silverlight 和 ui 线程中,这是预期的行为(挂起的应用程序)。我似乎找不到更多的官方文档,尽管我可以发誓我记得过去看过它......

我不记得确切的细节,但我相当肯定直接阻塞 ui 线程会导致一切停止运行。我似乎记得 UI 线程处理网络 IO。

无论您想在 WaitOne 调用后发生什么,都需要将其移至回调。

虽然这不是您的确切情况,但此链接中有相关信息。它解释了阻塞 UI 线程会阻止 Web 服务调用,因为它也会阻塞 UI 消息队列。我意识到您的电话正在从线程池中发出。我仍然认为阻塞 ui 线程会干扰,但我找不到具体解释原因的文档。

http://www.codeproject.com/Articles/31018/Synchronous-Web-Service-Calls-with-Silverlight-Dis(目前我能找到的最好的,我会在/如果我找到我的文章时更新寻找)。

于 2012-05-04T23:24:21.890 回答