Вставить запись данных в базу данных с помощью BlockingCollection в Multiple Producers - Single Consumer - PullRequest
0 голосов
/ 24 января 2019

Я довольно новичок в проблеме производителей и потребителей, поэтому прошу прощения. Я создал образец примера У меня есть 5 задач в общей сложности - 4 задачи для производителей и 1 задача для потребителя:

SqlConnection sqlConn = new SqlConnection(PANELSPLIT.Properties.Settings.Default.dbConn);
BlockingCollection<KeyValuePair<string, string>> dataItems = new BlockingCollection<KeyValuePair<string, string>>(54);
private KeyValuePair<string, string> bc1;
private delegate void updateTextBox1(string imagepath);
private delegate void updateTextBox2(string imagepath);
private delegate void updateTextBox3(string imagepath);
private delegate void updateTextBox4(string imagepath);

private void Form1_Load(object sender, EventArgs e)
{
    var  t1 = Task.Factory.StartNew(()=> addition());
    var t2 = Task.Factory.StartNew(() => subtraction());
    var t3 = Task.Factory.StartNew(() => multiply());
    var t4 = Task.Factory.StartNew(() => divide());
    var t5 = Task.Factory.StartNew(() => consumer());

}

private void consumer()
{


    while (true)
    {
        if (dataItems.TryTake(out bc1)){
            Console.WriteLine(bc1.ToString());
            if(bc1.Key== "addition")
            {
                updateTextBox1 tb1 = new updateTextBox1(updatetb1);
                this.textBox1.BeginInvoke(tb1, bc1.Value);
            }
            else if(bc1.Key == "Multiply")
            {
                updateTextBox1 tb2 = new updateTextBox1(updatetb2);
                this.textBox2.BeginInvoke(tb2, bc1.Value);
            }
            else if (bc1.Key == "Divide")
            {
                updateTextBox1 tb3 = new updateTextBox1(updatetb3);
                this.textBox1.BeginInvoke(tb3, bc1.Value);
            }
            else
            {
                 updateTextBox1 tb4 = new updateTextBox1(updatetb4);
                this.textBox1.BeginInvoke(tb4, bc1.Value);
            }

            }
        else
        {
            Console.WriteLine("Empty");

        }
    }  
}

private void updatetb4(string imagepath)
{
    this.textBox4.Text = imagepath;
}

private void updatetb3(string imagepath)
{
    this.textBox3.Text = imagepath;
}

private void updatetb2(string imagepath)
{
    this.textBox2.Text = imagepath;
}

private void updatetb1(string imagepath)
{
    this.textBox1.Text = imagepath;
}

private void divide()
{

    int a = 6;
    int b = 2;
    dataItems.Add(new KeyValuePair<string, string>("Divide", (a/b).ToString()));

}

private void multiply()
{
    int a = 6;
    int b = 2;
    dataItems.Add(new KeyValuePair<string, string>("Multiply", (a * b).ToString()));

}

private void subtraction()
{
    int a = 6;
    int b = 2;
    dataItems.Add(new KeyValuePair<string, string>("subtraction", (a - b).ToString()));
     }

private void addition()
{
    int a = 6;
    int b = 2;
    dataItems.Add(new KeyValuePair<string, string>("addition", (a + b).ToString()));

}

Я хочу сохранить эти значения в моей базе данных, поэтому я создал таблицу в sqlserver: Numb с 4 столбцами - id,Addition,Multiply,Divide,Subtraction. Таким образом, потребитель добавляет значение в коллекцию в таблицу для конкретного примера datacell: если ключ был «добавлением», тогда bc1.value должен быть вставлен в datacell = 1 и так далее для других.

Вопросы

Как мне это реализовать?

Кроме того, как мне поддерживать согласованность в базе данных?

...