我有理解困难时期 Wait(),Pulse(),PulseAll().他们都会避免僵局吗?如果您解释如何使用它们,我将不胜感激?
我在C#3.0和Monitor.Enter中使用Generic.Queue,等待,在使用队列之前退出等待(等待元素入队).现在我转到C#4.
任何人都可以建议我哪一个是快速的,尤其是避免锁定..
BlockingCollection vs concurrentQueue或其他任何东西......
注意.我不想限制我的制片人
提前致谢..
如果Queue中没有项目,ConcurrentQueue中的TryDequeue将返回false.
如果队列是空的,我需要我的队列将等待,直到新项目被添加到队列中并且它将新队列出列,并且该过程将继续这样.
我应该在C#4.0中使用monitor.enter,wait,pulse或任何更好的选项
我正在开发一个控制台应用程序
我想使用Threadpool来执行Web下载.这是一些假代码.
for (int loop=0; loop< 100; loop++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(GetPage), pageList[loop]);
}
snip
private static void GetPage(object o)
{
//get the page
}
Run Code Online (Sandbox Code Playgroud)
如何防止我的代码启动两个以上(或十个或其他)同步线程?
我试过了
ThreadPool.SetMaxThreads(1, 0);
ThreadPool.SetMinThreads(1, 0);
Run Code Online (Sandbox Code Playgroud)
但他们似乎没有任何影响.
我想弄清楚使用队列的最佳方法是什么.我有一个返回DataTable的进程.反过来,每个DataTable都与之前的DataTable合并.有一个问题,在最终的BulkCopy(OutOfMemory)之前要保留的记录太多.
所以,我已经确定我应该立即处理每个传入的DataTable.考虑一下ConcurrentQueue<T>......但我不知道该WriteQueuedData()方法如何知道将一个表出列并将其写入数据库.
例如:
public class TableTransporter
{
private ConcurrentQueue<DataTable> tableQueue = new ConcurrentQueue<DataTable>();
public TableTransporter()
{
tableQueue.OnItemQueued += new EventHandler(WriteQueuedData); // no events available
}
public void ExtractData()
{
DataTable table;
// perform data extraction
tableQueue.Enqueue(table);
}
private void WriteQueuedData(object sender, EventArgs e)
{
BulkCopy(e.Table);
}
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是,除了我实际上没有订阅任何事件的事实,如果我ExtractData()异步调用这将是我需要的全部内容吗?第二,我是否缺少关于ConcurrentQueue<T>函数的方式以及需要某种形式的触发器与排队对象异步工作的东西?
更新
我刚刚派生出一个ConcurrentQueue<T>具有OnItemQueued事件处理程序的类.然后:
new public void Enqueue (DataTable Table)
{
base.Enqueue(Table);
OnTableQueued(new TableQueuedEventArgs(Table));
}
public void OnTableQueued(TableQueuedEventArgs table)
{
EventHandler<TableQueuedEventArgs> handler = TableQueued; …Run Code Online (Sandbox Code Playgroud) 一个图像说的不仅仅是文字,所以这里基本上就是我想要实现的目标:(
为了简洁起见,我还使用了水果类比)

我过去很多次使用不同的.Net类之王(BackGroundWOrkers,ThreadPool,Self Made Stuff ......)做过这种事情.
我在这里要求提供建议并获得有关如何有效地做到这一点的新想法.
这是一个高计算程序,因此我收到数百万(结构相似但内容不相似)的数据,这些数据必须排队才能根据其内容类型进行处理.因此,我想避免为每个要处理的单个数据创建并行任务(这会使CPU过载并且设计不佳恕我直言).这就是为什么我想到只有一个线程为EACH数据TYPE运行,专门用于处理它(知道"Press Juice"方法是通用的并且独立于要按下的水果)
欢迎任何想法和实施建议.
我可以自由地提供任何进一步的细节.
我正在寻找.NET的线程安全阻塞队列的实现.通过"线程安全阻塞队列"我的意思是: - 线程安全访问队列,其中Dequeue方法调用阻塞一个线程,直到其他线程放入(Enqueue)某个值.
到目前为止,我发现了这个:http://www.eggheadcafe.com/articles/20060414.asp (但它适用于.NET 1.1).
有人可以评论/批评这种实施的正确性.或建议另一个.提前致谢.
我想要一个函数在一个线程上连续检查队列是否有新的添加
显然,可以选择连续循环播放睡眠,但我希望减少浪费.
我考虑了某种类型的等待句柄,然后让队列发出信号,但我无法安全地覆盖Enqueue,因为它不是虚拟的.
现在我正在考虑封装一个Queue<T>作为我最好的选择,但我想问你好人,如果有更好的人!
我的想法是:我希望许多线程访问套接字连接,同时保证他们只读取其消息的响应,所以我将有一个线程调度和读取响应,然后用响应数据执行回调(以纯文本格式)
这不是关于我能够或应该以最佳方式利用队列的不同方法,而是我所看到的对我来说毫无意义的事情.
void Runner() {
// member variable
queue = Queue.Synchronized(new Queue());
while (true) {
if (0 < queue.Count) {
queue.Dequeue();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是在一个线程中运行的:
var t = new Thread(Runner);
t.IsBackground = true;
t.Start();
Run Code Online (Sandbox Code Playgroud)
其他事件是"排队"其他地方.我所见到的是在一段时间内,Dequeue实际上会抛出InvalidOperationException,队列为空.这应该是不可能看到计数如何保证那里有东西,我很肯定没有别的东西是"出列".
问题:
编辑(澄清):
这些代码片段是实现后台帮助程序线程的Wrapper类的一部分.此处的Dequeue是唯一的Dequeue,并且所有Enqueue/Dequeue都在Synchronized成员变量(队列)上.
在指定的线程上执行某些代码有什么方法?所以让我们假设我有一个Thead和一个委托,我需要在这个线程上执行这个委托.我该如何实现它?
我对SynchronizationContext等基础设施不感兴趣,我想知道手动实现这种行为的方法.
c# ×8
.net ×4
queue ×2
c#-3.0 ×1
collections ×1
concurrency ×1
consumer ×1
producer ×1
threadpool ×1