1

操作を実行しているバックグラウンド スレッドがある場合は、UI スレッドが終了するまで待機してから結果を取得したいと思います。

詳細。ダイアログ ボックスを表示すると、ユーザーは 2 つの情報に関心がInfo1ありInfo2ます。 Info1取得には 5 秒かかり、取得にInfo2は 15 ~ 30 秒かかります。ユーザーを困らせないように、最初に取得/表示し、取得Info1するためのボタンを提供しますInfo2

フェッチするときはInfo1、バックグラウンド スレッドを開始してフェッチしInfo2ます。ユーザーが のボタンを押すまでにInfo2、情報が既にフェッチされ (そしてメモリ構造にキャッシュされ) ており、ユーザーがすぐに情報を確認できることが期待されます。

実際には、90% の確率で、ユーザーInfo2はバックグラウンド スレッドが完了する前にボタンを押します。

私の質問はこれです。バックグラウンド スレッドに自由にフックし、操作が終了したときにその結果を取得するのに適したパターンは何ですか?

4

2 に答える 2

0

参考までに、これが私が問題を解決した方法です。解決策は単純でパターン化されていません。私が最初から始めていたら、@agbinfo が示唆するようにおそらく Futures を使用していたでしょう。

private Thread thInfo2;

public Result GetData(Request request) {

    if (request.DataType == eDataType.Info2) {

        // if the request for Info2 is in progress already, wait a bit.
        while (thInfo2 != null && thInfo2.IsAlive)
        {
            Debug.WriteLine("Waiting");
            Thread.Sleep(500);
        }
    }     

    // fire off the fetch
    Response response = svc.GetData(request)

    // kick off a secondary fetch if this request is for Info1
    if (request.DataType == eDataType.Info2) {
        thInfo2 = new Thread(FetchInfo2InBackground)
        {
            Priority = ThreadPriority.Lowest,
            IsBackground = true
        };
        thInfo2.Start(request);  
    }     
}
于 2013-06-20T17:06:18.353 に答える
0

.Net 4.5 を使用している場合は、 async/await をご覧ください。これらはシナリオに合わせて設計されています。

于 2013-06-19T22:05:21.610 に答える