- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在得到的是一个每 5000 毫秒触发一次的计时器:
static Timer _aTimer = new System.Timers.Timer();
static void Main(string[] args)
{
_aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
_aTimer.Interval = 5000;
_aTimer.Enabled = true;
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
On fire 然后设置处理文件的队列:
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
// stop the timer so we dont reprocess files we already have in the queue
StopTimer();
// setup a list of queues
var lists = new List<IncomingOrderQueue>();
//get the accounts in which the files we are looking in
var accounts = new List<string>() { "Account1", "Account2" };
//loop through the accounts and set up the queue
foreach (var acc in accounts)
{
// create the queue
var tmp = new IncomingOrderQueue();
// for each file in the folders add it to be processed in the queue
foreach (var orderFile in OrderFiles(acc))
{
tmp.EnqueueSweep(new QueueVariables() { Account = acc, File = orderFile });
}
// add the queue to the list of queues
lists.Add(tmp);
}
// for each of the queues consume all the contents of them
Parallel.ForEach(lists, l => l.Consume());
//start the timer back up again because we have finished all the files we have in the current queue
StartTimer();
}
public static void StopTimer()
{
Console.WriteLine("Stop Timer");
_aTimer.Stop();
_aTimer.Enabled = false;
}
public static void StartTimer()
{
Console.WriteLine("Start Timer");
_aTimer.Enabled = true;
_aTimer.Start();
}
阻塞队列本身:
public class IncomingOrderQueue
{
BlockingCollection<QueueVariables> _orderQ = new BlockingCollection<QueueVariables>();
public void EnqueueSweep(QueueVariables incoming)
{
// add items to the queue
_orderQ.Add(incoming);
}
public void Consume()
{
// stop anything been adding to the queue
_orderQ.CompleteAdding();
// consume all the objects in the blocking collection
Parallel.ForEach(_orderQ.GetConsumingEnumerable(), Processor.Order.Object);
}
public int QueueCount
{
get
{
return _orderQ.Count;
}
}
}
我的工作原理是,启动计时器 -> 停止计时器 -> 触发收集文件夹中所有文件的过程 -> 处理所有文件 -> 重新启动计时器。
我忍不住认为有更好的方法来完成我正在做的事情,尤其是当要为帐户创建的队列数量为 200 - 400 时。
谢谢
最佳答案
我认为您不需要停止和启动您的生产者和消费者。 BlockingCollection
可以在达到最大容量时阻止生产者,如果为空则阻止消费者。
我也可能从一个 BlockingCollection
开始,直到分析显示我需要另一个。根据生产者和消费者的相对速度,您可能需要调整他们的数量。如果它们是 IO 绑定(bind)的,那么它们应该是异步的,你可以有很多,如果它们是 CPU 绑定(bind)的,你可能不需要超过可用处理器的数量。
我重做了你的例子,假设 IO 绑定(bind)生产者和消费者,希望它能给你一些想法。它以 10 秒的间隔触发生产者,并可以继续运行,直到您通过 CanellationToken
取消生产。只有在您取消并完成生产后,您才能CompleteAdding
释放被阻止的消费者。
public class QueueVariables
{
public string Account {get;set;}
public string File {get;set;}
}
public static ConcurrentQueue<string> GetACcounts()
{
return new ConcurrentQueue<string>(new []
{
"Account1",
"Account2",
"Account3",
"Account4",
"Account5",
"Account6",
"Account7",
"Account8",
"Account9",
"Account10",
"Account11",
"Account12",
});
}
public static List<string> GetFiles(string acct)
{
return new List<string>
{
"File1",
"File2",
"File3",
"File4",
"File5",
"File6",
"File7",
"File8",
"File9",
"File10",
"File11",
"File12",
};
}
public static async Task StartPeriodicProducers(int numProducers, TimeSpan period, CancellationToken ct)
{
while(!ct.IsCancellationRequested)
{
var producers = StartProducers(numProducers, ct);
// wait for production to finish
await Task.WhenAll(producers.ToArray());
// wait before running again
Console.WriteLine("***Waiting " + period);
await Task.Delay(period, ct);
}
}
public static List<Task> StartProducers(int numProducers, CancellationToken ct)
{
List<Task> producingTasks = new List<Task>();
var accounts = GetACcounts();
for (int i = 0; i < numProducers; i++)
{
producingTasks.Add(Task.Run(async () =>
{
string acct;
while(accounts.TryDequeue(out acct) && !ct.IsCancellationRequested)
{
foreach (var file in GetFiles(acct))
{
_orderQ.Add(new UserQuery.QueueVariables{ Account = acct, File = file });
Console.WriteLine("Produced Account:{0} File:{1}", acct, file);
await Task.Delay(50, ct); // simulate production delay
}
}
Console.WriteLine("Finished producing");
}));
}
return producingTasks;
}
public static List<Task> StartConsumers(int numConsumers)
{
List<Task> consumingTasks = new List<Task>();
for (int j = 0; j < numConsumers; j++)
{
consumingTasks.Add(Task.Run(async () =>
{
try
{
while(true)
{
var queueVar = _orderQ.Take();
Console.WriteLine("Consumed Account:{0} File:{1}", queueVar.Account, queueVar.File);
await Task.Delay(200); // simulate consumption delay
}
}
catch(InvalidOperationException)
{
Console.WriteLine("Finished Consuming");
}
}));
}
return consumingTasks;
}
private static async Task MainAsync()
{
CancellationTokenSource cts = new CancellationTokenSource();
var periodicProducers = StartPeriodicProducers(2, TimeSpan.FromSeconds(10), cts.Token);
var consumingTasks = StartConsumers(4);
await Task.Delay(TimeSpan.FromSeconds(120));
// stop production
cts.Cancel();
try
{
// wait for producers to finish producing
await periodicProducers;
}
catch(OperationCanceledException)
{
// operation was cancelled
}
// complete adding to release blocked consumers
_orderQ.CompleteAdding();
// wait for consumers to finish consuming
await Task.WhenAll(consumingTasks.ToArray());
}
// maximum size 10, after that capaicity is reached the producers block
private static BlockingCollection<QueueVariables> _orderQ = new BlockingCollection<QueueVariables>(10);
void Main()
{
MainAsync().Wait();
Console.ReadLine();
}
// Define other methods and classes here
关于c# - 使用阻塞集合创建文件拾取过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526988/
我发现运行良好的代码片段可以轻松创建模块化 Delphi 应用程序。此代码适用于 Delphi 5 版本。 链接到片段 -> http://delphi.cjcsoft.net/viewthread.
我正在通过下面的代码以编程方式创建搜索索引。问题是插入设计文档后如何建立索引?或者它是第一次由 .search() 方法使用构建? var book_indexer = function(doc) {
我有一个非常小的项目,我想创建一个设置表单。做这个的最好方式是什么?简单地创建另一个带有复选框/文本框的 Windows 窗体并使用 Properties.Settings 类保存这些设置?它可能会起
我试图通过引用已经存在的 dm-linear、dm-snapshot、dm-cache 等来实现设备映射器目标。在我的实现中,我需要对某个扇区范围执行读/修改/写操作。由于设备映射器直接与块层对话,我
现在我有了一些空闲时间,我决定创建一个 Java 程序来将我的 XBee(即 zigbee)芯片连接到我的新 SmartThings 集线器。我找到了一个很好的教程,通过手动创建数据包来完成此操作(
我有一系列这种形式的静态实用方法: StringBuffer Util.doA(String arg0, String arg1, SomeEnum e); StringBuffer Util.do
我有一个 d3dDevice: ComPtrd3dDevice; 我在这里将它用于 dxgiDevice: ComPtr dxgiDevice2; HRESULT hr; hr
如何仅使用 css(样式)为我的 react-native View 组件背景创建此设计? 我希望 View 2 具有绿色背景,顶部有一条小曲线,与右上角的中心相交。 仅使用 borderRadius
我正在尝试创建一个有点动态的 html 类,它根据类末尾包含的数字设置宽度 %。注意:类名将始终以“gallery-item-”开头 示例:div.gallery-item-20 = 20% 宽度 我
基本上,我想要创 build 备方向值 alpha、beta 和 gamma 的可视化表示。到目前为止,我已经设法使用 innerHTML 以纯文本形式显示值,但我想为每个值创建一系列“条形图”。我根
我想用 Java 创 build 计二维码。 设计二维码可能包含图形形式的 Logo 。下面是此类设计代码的示例。 如何创建这样的二维码? 最佳答案 我刚刚找到了一个可以创建此类 QR 码的软件。 T
据我了解,SyncResponse 的有效负载是一个 Device 类型的数组。 我的问题是我无法创建在 SyncResponse - Payload - Device 内部定义的设备类型实例(无权访
我现在正在考虑如何创建类似以下事实的 android 应用程序... 起始页是 gridview,显示的列数将基于在设备屏幕分辨率上 当我点击 gridview 上的一项时,以下屏幕将根据设备分辨率显
我正在开发设备 onwer 应用程序,其中我必须使用 NFC 作为设备所有者安装我的应用程序,但是当我触摸两个设备并尝试安装应用程序时出现错误“由于校验和错误无法安装管理应用程序” 请告诉我哪里做错了
如何在不使用 mknod 或 MAKEDEV 的情况下(即通过使用动态注册)创 build 备文件。 最佳答案 假设你想在插入时动态分配一个主设备号给一个字符设备,使用: int alloc_chrd
我正在使用 .NET 为 IE 开发工具栏。目前,我使用 gacutil 插入我的 .NET 程序集,并使用 regasm 注册我的 COM 程序集。 我想为项目创建一个设置 (MSI),但我似乎无法
在为设置页面创建 Activity 后,我注意到 if (mCurrentValue !== value) 中的 mCurrentValue !== value 返回警告: Identity equa
我正在为用 C# 开发的软件开发设置表单。我正在研究不同的软件如何实现它们的设置表单。 在我遇到的大多数情况下,他们似乎在表单的左 Pane 中使用 Treeview,在右 Pane 中使用配置设置。
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我正在尝试从 NodeJS 后端创建文档 ( https://firebase.google.com/docs/cloud-messaging/js/device-group ) 中所述的设备组,但我
我是一名优秀的程序员,十分优秀!