Task.Factory.StartNew依赖于父线程?

时间:2013-03-19 18:29:35

标签: c# multithreading task taskfactory

我在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但仍然等待该线程在它返回值后完成。

3 个答案:

答案 0 :(得分:1)

如果除了等待后台线程完成之外你什么都不做,那么你也可以不首先创建新的后台线程并在线执行代码。

答案 1 :(得分:1)

你不能把它作为父任务的延续。所以执行

FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);作为成功完成父任务的延续。然后你可以等待延续。

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

然后您可以决定是否要等待子任务或使用其他延续。

答案 2 :(得分:0)

试试这个:

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

int x = dosomething();

task.Wait();
return x;

您还应该锁定使用它们的线程中的对象,而不是其他一些随机线程。