相关疑难解决方法(0)

异步WCF方法等待后,WebOperationContext为null

在以下示例中,该方法作为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)

每个的性能和线程安全性会产生什么影响?

c# wcf async-await

4
推荐指数
1
解决办法
2530
查看次数

在WCF方法中使用Task.WaitAll

我有一个.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

3
推荐指数
1
解决办法
569
查看次数