我正在尝试将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传递给新线程。
答案 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);