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 回答