using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
class Dto {
public int State;
public int Index;
}
class Test {
BlockingCollection<Dto> list = new BlockingCollection<Dto>();
public void Run() {
Task.Run(() => backgroundWorker2());
Task.Run(() => backgroundWorker1());
}
void backgroundWorker1() {
for(int i=0; i < 3; i++) {
list.Add(new Dto() { Index = i, State = 2 });
Thread.Sleep(100); // <--------------------------- added
}
}
void backgroundWorker2() {
foreach (var v in list.GetConsumingEnumerable()) {
// сохраняем данные
Console.WriteLine("index=" + v.Index + " state=" + v.State);
// если сохранить не удалось, то возвращаем в list
if (v.Index == 0 && v.State++ < 2) list.Add(v);
if(list.Count == 0)
break;
}
Console.WriteLine("completed");
}
}
public class Program
{
public static void Main()
{
var t = new Test();
t.Run();
Thread.Sleep(1000); // <----------------- added
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuQ29uY3VycmVudDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCmNsYXNzIER0byB7CiAgICBwdWJsaWMgaW50IFN0YXRlOwogICAgcHVibGljIGludCBJbmRleDsKfQoKY2xhc3MgVGVzdCB7CiAgICBCbG9ja2luZ0NvbGxlY3Rpb248RHRvPiBsaXN0ID0gbmV3IEJsb2NraW5nQ29sbGVjdGlvbjxEdG8+KCk7CiAgICBwdWJsaWMgdm9pZCBSdW4oKSB7CiAgICAgICAgVGFzay5SdW4oKCkgPT4gYmFja2dyb3VuZFdvcmtlcjIoKSk7CiAgICAgICAgVGFzay5SdW4oKCkgPT4gYmFja2dyb3VuZFdvcmtlcjEoKSk7CiAgICB9CiAgICB2b2lkIGJhY2tncm91bmRXb3JrZXIxKCkgewogICAgICAgIGZvcihpbnQgaT0wOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBEdG8oKSB7IEluZGV4ID0gaSwgU3RhdGUgPSAyIH0pOwogICAgICAgICAgICBUaHJlYWQuU2xlZXAoMTAwKTsgLy8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhZGRlZAogICAgICAgIH0KICAgIH0KICAgIHZvaWQgYmFja2dyb3VuZFdvcmtlcjIoKSB7CiAgICAgICAgZm9yZWFjaCAodmFyIHYgaW4gbGlzdC5HZXRDb25zdW1pbmdFbnVtZXJhYmxlKCkpIHsKICAgICAgICAgICAgLy8g0YHQvtGF0YDQsNC90Y/QtdC8INC00LDQvdC90YvQtQogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiaW5kZXg9IiArIHYuSW5kZXggKyAiIHN0YXRlPSIgKyB2LlN0YXRlKTsKICAgICAgICAgICAgLy8g0LXRgdC70Lgg0YHQvtGF0YDQsNC90LjRgtGMINC90LUg0YPQtNCw0LvQvtGB0YwsINGC0L4g0LLQvtC30LLRgNCw0YnQsNC10Lwg0LIgbGlzdAogICAgICAgICAgICBpZiAodi5JbmRleCA9PSAwICYmIHYuU3RhdGUrKyA8IDIpIGxpc3QuQWRkKHYpOwogICAgICAgICAgICBpZihsaXN0LkNvdW50ID09IDApIAogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiY29tcGxldGVkIik7IAogICAgfQp9CgoKcHVibGljIGNsYXNzIFByb2dyYW0KewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCXZhciB0ID0gbmV3IFRlc3QoKTsKICAgICAgICB0LlJ1bigpOwogICAgICAgIFRocmVhZC5TbGVlcCgxMDAwKTsgLy8gPC0tLS0tLS0tLS0tLS0tLS0tIGFkZGVkCgl9Cn0=