Общий буфер в C # [пример на Java] - PullRequest
3 голосов
/ 16 января 2012

Есть ли какой-нибудь класс библиотеки, который я могу использовать для буфера в ситуации потребитель-производитель с несколькими потоками? Я не очень хорошо понимаю многопоточность C #, поэтому пример идеального решения на Java:

//Thread 1
Buffer buf = new Buffer();
Thread t2 = new Thread(new MyRunnable(buf) );
    while(true){
        buf.put(foo);
    }
}

//MyRunnable
private Buffer buf;

public MyRunnable(Buffer buf){
    this.buf = buf;
}

public void run(){
    while(!buf.IsFinished()){
        foo = buf.take();
        dosth(foo);
    }
}

Ответы [ 3 ]

3 голосов
/ 16 января 2012

System.Collection.Concurrent имеет ряд реализаций интерфейса IProducerConsumerCollection<T> (например, ConcurrentQueue<T>), который может быть полезен в вашей ситуации.

Существует также класс BlockingCollection<T>, который позволяет вашему потоку блокироваться во время ожидания ввода.

1 голос
/ 16 января 2012

Для этого вы можете использовать .NET 4.0 ConcurrentBag<T>. Он реализует IProducerConsumerCollection<T>, который предназначен для этого.

Если заказ имеет значение, вы можете посмотреть на ConcurrentQueue<T> или ConcurrentStack<T>.

0 голосов
/ 16 января 2012

Похоже, вы просто пытаетесь найти способ выполнить некоторую работу в фоновом потоке и передать собранные данные вызывающей стороне?

Вы можете использовать класс BackgroundWorker за это.Он позволяет вам создать простой фоновый поток и передать что-то обратно вызывающей стороне, когда вы закончите.

public class TestClass
{
   private BackgroundWorker worker;

   public void DoSomeWorkAsync()
   {
      this.worker = new BackgroundWorker();
      this.worker.DoWork += this.OnDoWork;
      this.worker.RunWorkerCompleted += this.OnWorkerComplete;
      this.worker.RunWorkerAsync();
   }  

   private void OnDoWork(object sender, DoWorkEventArgs e)
   {
      //do long running process here to pass to calling thread.
      //note this will execute on a background thread
      DataTable DT = GetSomeData();
      e.Result = DT;
   }

   private void OnWorkerComplete(object sender, RunWorkerCompletedEventArgs e)
   {
      //note this event is fired on calling thread
      if (e.Error != null)
         //do something with the error
      else if (e.Cancelled) 
         //handle a cancellation
      else
         //grab the result
         foo = e.Result;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...