在以下示例中,该方法作为WCF服务操作公开,并且该服务在IIS中承载.在进入函数时,WebOperationContext.Current按预期设置.然而,在await完成等待之后,WebOperationContext.Current被设置为null.
public async Task TestAsync()
{
//WebOperationContext.Current is set
Task t = new Task(()=>Thread.Sleep(10000));
t.Start();
await t;
//WebOperationContext.Current is null
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个缺点,所以我想知道是否有人知道这一点以及是否有任何好的方法.我意识到我可以在局部变量中缓存对conext的引用,但这看起来不太好.
更新
一种有效的方法是
public async Task TestAsync()
{
WebOperationContext ctx = WebOperationContext.Current;
Task t = new Task(()=>Thread.Sleep(10000));
t.Start();
await t;
//ctx is set
}
Run Code Online (Sandbox Code Playgroud)
而且,正如其他人所暗示的那样,我可以做到这一点
public async Task TestAsync()
{
CallContext.LogicalSetData("WebOperationContext.Current", WebOperationContext.Current);
Task t = new Task(()=>Thread.Sleep(10000));
t.Start();
await t;
WebOperationContext ctx = (WebOperationContext)CallContext.LogicalGetData("WebOperationContext.Current");
}
Run Code Online (Sandbox Code Playgroud)
每个的性能和线程安全性会产生什么影响?
我有一个.NET 4.5.1 WCF服务,它处理来自数千个用户将使用的应用程序的同步.我目前使用Task.WaitAll,如下所示,它工作正常,但我读到这很糟糕,可能导致死锁等等.我相信我曾经尝试过WhenAll而且它没有用,我不记得这些问题我再次回到这里进行审查,以确保我做得对.我担心的是在这种使用中是否需要阻塞和首选,WCF服务方法因此WaitAll似乎没有问题地工作.
我有大约十几种方法,每种方法都更新实体框架6中的实体,用现有数据处理传入数据并进行必要的更改.这些方法中的每一种都很昂贵,所以我想主要使用并行性来使所有方法在这个功能强大的24核服务器上同时工作.每个方法返回为Task,在Task.Run中包装其内容.DoSync方法创建了一个新List,并将每个同步方法添加到列表中.然后我调用Task.WaitAll(taskList.ToArray())并且所有工作都很棒.
这是正确的做法吗?我想确保此方法可以很好地扩展,不会导致问题,并在WCF服务方案中正常工作.
c# parallel-processing wcf task-parallel-library async-await