Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Task.Factory.StartNew是否依赖于父线程?_C#_Multithreading_Task_Taskfactory - Fatal编程技术网

C# Task.Factory.StartNew是否依赖于父线程?

C# Task.Factory.StartNew是否依赖于父线程?,c#,multithreading,task,taskfactory,C#,Multithreading,Task,Taskfactory,我在一个WCF服务库的方法中运行这个线程 下面的代码在方法末尾执行。我这样做是因为我不希望用户等待后台进程完成,而这不会影响从WCF到客户端的输出 我现在遇到的问题是,如果我执行该线程,客户机得到响应,那么父线程将被终止;也要杀死这个线程。如何使父线程在执行其余操作时等待该线程完成 class Program { static void Main(string[] args) { Dictionary<string, string>

我在一个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();
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
Dictionary sampleDict=getPopulatedDictionary();
var结果=运行(sampleDict);
}
公共静态整型运行(字典示例)
{
性能计算(样本计算);
如果(sampleDict_uu2;.Keys.Count>10)
{
System.Threading.Tasks.Task.Factory.StartNew(()=>
{
背景过程(sampleDict);
});
}
//回来后,我仍然希望它运行
返回sampleDict.Keys.Count;
}
私有静态void backgroundprocess(字典dict dict)
{
foreach(dict.Keys中的变量k)
{
dict[k]=new Random().Next(2666).ToString();
}
}
}
简言之,我希望此方法启动该线程并转到返回值X,但在返回值后仍等待该线程完成。

尝试以下操作:

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

int x = dosomething();

task.Wait();
return x;

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

如果您除了等待后台线程完成之外不打算执行任何操作,然后,您也可以不首先创建新的后台线程并在线执行代码。

您不能将其作为父任务的延续吗。所以执行

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

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

然后,您可以决定是要等待子任务还是使用另一个延续。

这不是要等待任务完成后再返回x吗?等待将在任务完成并执行FameMappingEntry时返回。SaveFameDBMap(toSaveIdentifiers)已执行耶,我希望它返回,然后等待任务完成以应用任务,需要更详细的返回值顺序过程。请考虑同步调用:这样,它不可能返回一个值,然后启动一个线程并等待它吗?这种情况不同的原因是数据需要尽快发送到客户端。因此,等待整个过程完成将花费更多的时间。@Ramie好吧,您关于父线程完成将停止此线程的说法本质上是不正确的。父线程不需要停留在此线程上即可继续。这个过程不能结束,但就你而言,我高度怀疑整个过程是否已经结束。我猜您正在从后台任务中访问一些请求或响应信息,这些信息只有在执行上下文存在时才有效。也有可能您正在使用一个DBContext,当执行继续时,该DBContext将被丢弃。您知道我如何处理它,使它不会停留在这个线程上继续吗?@Ramie不知道它到底在做什么,我不能说。我发布了一些代码,希望它能让您更好地理解我需要什么