Task.Factory.StartNew зависит от родительского потока?
Я запускаю этот поток внутри метода из библиотеки служб 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 ответа
Не могли бы вы сделать это как продолжение родительской задачи. Так выполнить
FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);
как продолжение успешного завершения родительского задания. И тогда вы можете подождать продолжения.
var childTask = parentTask.ContinueWith((pt) =>
{
FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
И тогда вы можете решить, хотите ли вы дождаться выполнения дочерней задачи или использовать другое продолжение.
Если вы не собираетесь ничего делать, кроме как дождаться завершения фонового потока, вы можете просто не создавать новый фоновый поток и выполнять код в строке.
Попробуй это:
var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
lock (toSaveIdentifiers)
{
FameMappingEntry.SaveFameDBMap(toSaveIdentifiers);
}
);
int x = dosomething();
task.Wait();
return x;
Вы также должны блокировать объекты в потоке, который их использует, а не какой-то другой случайный поток.