我正在寻找实现一个生产者多个消费者多线程应用程序的最佳方案.目前我正在使用一个队列来共享缓冲区,但它比一个生产者一个消费者的情况要慢得多.我打算这样做:
Queue<item>[] buffs = new Queue<item>[N];
object[] _locks = new object[N];
static void Produce()
{
int curIndex = 0;
while(true)
{
// Produce item;
lock(_locks[curIndex])
{
buffs[curIndex].Enqueue(curItem);
Monitor.Pulse(_locks[curIndex]);
}
curIndex = (curIndex+1)%N;
}
}
static void Consume(int myIndex)
{
item curItem;
while(true)
{
lock(_locks[myIndex])
{
while(buffs[myIndex].Count == 0)
Monitor.Wait(_locks[myIndex]);
curItem = buffs[myIndex].Dequeue();
}
// Consume item;
}
}
static void main()
{
int N = 100;
Thread[] consumers = new Thread[N];
for(int i = 0; i < N; i++)
{ …Run Code Online (Sandbox Code Playgroud) 好的,所以我想知道当我使用TaskCreationOptions.LongRunning. 通过这个答案,我开始知道对于长时间运行的任务,我应该使用这个选项,因为它在 threadpool 之外创建了一个线程。
凉爽的。但是当我在线程池之外创建线程时,我会得到什么好处呢?什么时候做并避免它?
有一个关于创建C#线程的快速问题.
我用ManualResetEvent创建了一个,它在调用Stop()时设置.这很好但是我需要创建另一个ManualResetEvent或wait句柄才能立即触发工作者吗?
有人能告诉我为什么以下代码不起作用?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(rtb2);
t.Start();
}
private void rtb2()
{
try
{
richTextBox1.Text = "1";
}
catch(InvalidOperationException ex)
{
MessageBox.Show("HI");
}
}
}
Run Code Online (Sandbox Code Playgroud)