相关疑难解决方法(0)

使用线程处理队列的最有效方法

我有一个队列,其上放置了待处理的傅立叶变换请求(相对耗时的操作) - 在某些情况下,我们每秒可以获得数千个变换请求,因此它必须快速.

我正在升级旧代码以使用.net 4,以及移植到TPL.我想知道处理这个队列的最有效(最快的吞吐量)方式是什么样的.我想使用所有可用的核心.

目前我正在尝试使用BlockingCollection.我创建了一个队列处理程序类,它产生4个任务,阻塞BlockingCollection并等待传入​​的工作.然后他们处理挂起的转换.码:

public class IncomingPacketQueue : IDisposable
    {
        BlockingCollection<IncomingPacket> _packetQ = new BlockingCollection<IncomingPacket>();

        public IncomingPacketQueue(int workerCount)
        {
            for (int i = 0; i < workerCount; i++)
            {
                Task.Factory.StartNew(Consume);
            }
        }

        public void EnqueueSweep(IncomingPacket incoming)
        {
            _packetQ.Add(incoming);
        }

        private void Consume()
        {
            foreach (var sweep in _packetQ.GetConsumingEnumerable())
            {
                //do stuff
                var worker = new IfftWorker();
                Trace.WriteLine("  Thread {0} picking up a pending ifft".With(Thread.CurrentThread.ManagedThreadId));
                worker.DoIfft(sweep);                

            }
        }

        public int QueueCount
        {
            get
            {
                return _packetQ.Count;
            }
        }

    #region …
Run Code Online (Sandbox Code Playgroud)

c# multithreading task-parallel-library c#-4.0

15
推荐指数
1
解决办法
5722
查看次数

Web API 2返回OK响应,但在后台继续处理

我已经为shopify创建了一个mvc web api 2 webhook:

public class ShopifyController : ApiController
{
    // PUT: api/Afilliate/SaveOrder
    [ResponseType(typeof(string))]
    public IHttpActionResult WebHook(ShopifyOrder order)
    {
        // need to return 202 response otherwise webhook is deleted
        return Ok(ProcessOrder(order));
    }
}
Run Code Online (Sandbox Code Playgroud)

其中ProcessOrder循环遍历订单并将详细信息保存到我们的内部数据库.

但是,如果进程花费的时间太长,那么webhook会再次调用api,因为它认为它已经失败了.有没有办法先返回ok响应,然后再进行处理?

有点像在mvc控制器中返回重定向并且可以选择在重定向后继续处理其余操作.

请注意,我总是需要以Shopify的形式返回ok响应,如果它失败了19次,那么智慧决定删除webhook(并且处理时间过长会被视为失败)

shopify asp.net-mvc-4 asp.net-web-api2

5
推荐指数
2
解决办法
6528
查看次数

从控制器返回,无需等待异步方法完成

我读过自己的蓝色,希望有一个简单的答案。

我有一个 Web API 可以处理来自各种“野外”应用程序的遥测 在我的一个控制器中,我想接收一个请求,将错误记录到我的中央监控数据库并尽可能立即返回响应(我没有真正的了解调用者端性能可能有多重要的方式,并且已经有一个对初始 Web 服务请求的重大影响)。

基本上,我正在寻找的是这样的:

public IHttpActionResult Submit() {
    try {
        var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);

        // ok, I've got content, now log it but don't wait
        // around to see the results of the logging, just return
        // an Accepted result and begone

        repository.SaveSubmission(model); // <-- fire and forget, don't wait

        return Accepted();

    } catch (Exception)
        return InternalServerError();
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来它应该是直截了当的,但显然不是。我已经阅读了许多不同的帖子,从是的,只是使用 Task.Run()这是一个可怕的错误,你永远无法实现你想要的!

我的场景中的问题似乎是这个进程可能会在进程中终止,因为它运行在 ASP.NET 工作进程上,而不管调用异步方法的不同方法的泥潭(我已经用了最后两个几个小时左右阅读各种SO问题和Stephen Cleary博客......哇)。

如果在这种情况下的潜在问题是我“触发并忘记”的方法绑定到 http 上下文并受到 ASP.NET 工作进程的提前终止,那么我的问题就变成了......

有没有办法从那个 ASP.NET …

c# asynchronous asp.net-web-api

5
推荐指数
1
解决办法
5288
查看次数