Передача HttpContext в задачу.Запустить поток

#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>, но я ожидал, что он вернет объект задания. Мой плохой, извините. Спасибо!