我在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但仍然等待该线程在它返回值后完成。
答案 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;
您还应该锁定使用它们的线程中的对象,而不是其他一些随机线程。