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