0

WCF サービス ライブラリのメソッド内でこのスレッドを実行しています。

以下のコードは、メソッドの最後に実行されます。これを行うのは、WCF からクライアントへの出力に影響を与えないバックグラウンド プロセスが完了するまでユーザーを待たせたくないからです。

私が今抱えている問題は、そのスレッドを実行してクライアントが応答を受け取ると、親スレッドが強制終了されることです。このスレッドも殺します。残りの操作を実行しながら、親スレッドがこのスレッドの終了を待機するようにするにはどうすればよいですか?

         class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, string> sampleDict = getPopulatedDictionary();
        var result = run(sampleDict);
    }

    public static int run(Dictionary<string, string> sampleDict_)
    {

        PerformCalculations(sampleDict_);
        if (sampleDict_.Keys.Count > 10)
        {
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                backgroundprocess(sampleDict_);
            });
        }
        //after returning i still want it to run
        return sampleDict_.Keys.Count;
    }

    private static void backgroundprocess(Dictionary<string,string> dict)
    {
        foreach (var k in dict.Keys)
        {
            dict[k] = new Random().Next(2666).ToString();
        }
    }
}

要するに、このメソッドがそのスレッドを開始して値 X を返すようにしたいのですが、値を返した後にそのスレッドが終了するのを待ちます。

4

3 に答える 3

1

バックグラウンドスレッドが完了するのを待つ以外に何もしない場合は、最初に新しいバックグラウンドスレッドを作成せずに、コードをインラインで実行することをお勧めします。

于 2013-03-19T18:38:17.947 に答える
1

親タスクの続きとしてできませんでしたか。だから実行する

FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);親タスクの正常な完了の継続として。そして、あなたは継続を待つことができます。

var childTask = parentTask.ContinueWith((pt) =>
{
   FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);
}, TaskContinuationOptions.OnlyOnRanToCompletion);

その後、子タスクを待機するか、別の継続を使用するかを決定できます。

于 2013-03-19T20:35:18.793 に答える
0

これを試して:

var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
  lock (toSaveIdentifiers)
  {
      FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);
  }
);

int x = dosomething();

task.Wait();
return x;

また、他のランダムなスレッドではなく、それらを使用するスレッドでオブジェクトをロックする必要があります。

于 2013-03-19T18:36:26.717 に答える