将HttpContext传递给Task.Run线程

时间:2016-10-17 09:55:09

标签: c# .net asynchronous async-await task

我正在尝试将HttpContext.Current传递给通过Task.Run创建的主题。因为我在HttpContext.Items中有一个交易ID,我需要在线程中。

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.Threading.Tasks.Task'转换   'string'

发生在最后一行。

似乎是我从匿名方法返回的方式的问题。

更新

似乎_service.UpdateJob正在返回Task但我希望它返回Job对象,道歉。

实际问题:在WebAPI中,我们希望在新线程中运行某些任务。 HttpContext.Items中有一个值TransactionID。我们希望新创建的线程能够读取TransactionID。上面的方法是将整个HttpContext传递给新线程。

1 个答案:

答案 0 :(得分:0)

嵌套使用任务会让人感到困惑,尤其是在没有使用async / await的情况下。

_ service.UpdateJob(jobjsonstring)会返回Task。因此,执行此函数的Task.Run将返回Task对象,其结果为Task

要获得_ service.UpdateJob电话的结果,您必须使用response.Result.Result

 var jobData = JObject.Parse(response.Result.Result);

另一种替代方法(没有async / await)是在函数内返回Result,例如

var response = TaskHelper.RunWithContext(() => _service.UpdateJob(jobjsonstring).Result);