#c# #.net #asynchronous #async-await #task
#c# #.net #асинхронный #асинхронный -ожидание #задача
Вопрос:
Я пытаюсь перейти HttpContext.Current
к потоку, созданному с помощью Task.Run
. Поскольку у меня есть идентификатор транзакции в in HttpContext.Items
, который мне понадобится в потоке.
public static Task<TResult> RunWithContext<TResult>(Func<TResult> function)
{
var context = HttpContext.Current;
return Task.Run(()=> { RequestHelper.SaveHttpContextInThread(context); return function(); } );
}
public static void SaveHttpContextInThread(HttpContext context)
{
Thread.SetData(Thread.GetNamedDataSlot(RequestHelper.THREAD_SLOT_NAME), context);
}
var response = TaskHelper.RunWithContext(() => _service.UpdateJob(jobjsonstring));
var jobData = JObject.Parse(response.Result); //Compiler error here
Но ошибка компилятора
‘Аргумент 1: невозможно преобразовать из ‘System.Потоковая передача.Задачи.Задача ‘ в ‘строку’
происходит в последней строке.
Похоже, проблема в том, как я возвращаюсь из анонимного метода.
Обновить
Кажется, _service .UpdateJob возвращал задачу, но я ожидал, что она вернет объект задания, извинения.
Актуальная проблема: в WebAPI мы хотим запустить некоторую задачу в новом потоке. В HttpContext есть значение TransactionID.Товары. Мы хотим, чтобы вновь созданный поток мог считывать TransactionID. Описанный выше подход заключался в передаче всего HttpContext в новый поток.
Комментарии:
1. Попробуйте
var jobData = JObject.Parse(response.Result.ToString());
2. Каков возвращаемый тип _service . Задание обновления?
3. @AlfieGoodacre После добавления toString ошибки нет. Но я пытаюсь создать RunWithContext, который может заменить Task.Run, без каких-либо других изменений. Любой возможный способ?
4. @rboe _service. UpdateJob возвращает объект задания.
5. @Baga — ответ. Результат. Результат может содержать строку.
Ответ №1:
Это может привести к путанице при вложенном использовании задач, особенно без использования async
/ await
.
_ service.UpdateJob(jobjsonstring)
возвращает a Task
. Поэтому Task.Run
, который выполняет эту функцию, возвращает Task
объект с a Task
в качестве результата.
Чтобы получить результат _ service.UpdateJob
вызова, который вы должны использовать response.Result.Result
.
var jobData = JObject.Parse(response.Result.Result);
Другой альтернативой (без async / await) является возврат результата внутри функции, например
var response = TaskHelper.RunWithContext(() => _service.UpdateJob(jobjsonstring).Result);
Комментарии:
1. Спасибо @rboe ! но любой способ заставить RunWithContext возвращать Task<string> вместо Task<Task<string>>
2. @Baga — Я обновил свой ответ в соответствии с вашим комментарием.
3. Кажется, _service . UpdateJob возвращал Task<string>, но я ожидал, что он вернет объект задания. Мой плохой, извините. Спасибо!