У меня есть сценарий, в котором я выполняю некоторую разновидность сообщений типа Actor-Model, где я хочу, чтобы метод вставлял задачу или делегировал в очередь (возможно, новый ConcurrentQueue), ждал, пока какой-то другой процесс обработает очередь, выполнить задачу, а затем вернуть результат, желательно без блокировки. Метод может быть вызван как синхронно, так и асинхронно. Одновременно может выполняться только одно действие в очереди
Я не могу обернуть голову, как сделать это несколько более производительным способом, пожалуйста, помогите:)
EDIT
Вот попытка, кто-нибудь видел какие-либо проблемы с этим подходом (исключая обработку исключений)? Кроме того, я могу себе представить, что это связано с большими накладными расходами по сравнению с простой блокировкой, и как это можно сравнить, например, с использованием асинхронных делегатов?
public partial class Form1 : Form
{
private BlockingCollection<Task<int>> blockingCollection = new BlockingCollection<Task<int>>(new ConcurrentQueue<Task<int>>());
private int i = 0;
public Form1() {
InitializeComponent();
Task.Factory.StartNew(() =>
{
foreach (var task in blockingCollection.GetConsumingEnumerable()) {
task.Start();
task.Wait();
}
});
}
public int Queue() {
var task = new Task<int>(new Func<int>(DoSomething));
this.blockingCollection.Add(task);
task.Wait();
return task.Result;
}
public int DoSomething() {
return Interlocked.Increment(ref this.i);
}
private void button1_Click(object sender, EventArgs e) {
Task.Factory.StartNew(() => Console.Write(this.Queue()));
}
}