Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行任务对共享变量的处理_C#_Task Parallel Library - Fatal编程技术网

C# 并行任务对共享变量的处理

C# 并行任务对共享变量的处理,c#,task-parallel-library,C#,Task Parallel Library,我从任务库开始。我写了一些简单的代码,比如 private void button1_Click(object sender, EventArgs e) { simpleMost(); } string mesg; void simpleMost() { mesg = ""; button1.Enabled = false; Task t1 = new Task(delegate { makeResult(1); }); Task t2 = new T

我从任务库开始。我写了一些简单的代码,比如

private void button1_Click(object sender, EventArgs e)
{
    simpleMost();
}

string mesg;
void simpleMost()
{
    mesg = "";
    button1.Enabled = false;

    Task t1 = new Task(delegate { makeResult(1); });
    Task t2 = new Task(delegate { makeResult(2); });
    Task t3 = new Task(delegate { makeResult(3); });

    t1.Start();
    t2.Start();
    t3.Start();

    t1.Wait();
    t2.Wait();
    t3.Wait();

    richTextBox1.Text = mesg;
    button1.Enabled = true;
}

void makeResult(int a)
{
    mesg += "\nTask" + a;
}
我一次又一次地点击我的按钮1,得到以下输出

一,

二,

三,

四,

五,

六,


在4,5,6种情况下,为什么
makeResult
不能正常工作。当我检查wait语句后的任务状态时,发现它们都已完成,但其中一个未正确执行传递给它的函数

您有几个任务,每个任务都以非原子方式修改相同的共享资源

mesg += "\nTask" + a;
实际上:

mesg = mesg + "\nTask" + a;
。。。因此,如果一个任务读取
mesg
,然后另一个任务向其写入新值,那么第一个任务将使用旧值连接字符串,并将其写回变量


避免这种情况的最简单方法是使用锁定,这样一次只有一个线程可以执行修改语句。它可能没有那么优雅,但它应该会删除您当前的竞争条件。

您有几个任务,每个任务都以非原子方式修改相同的共享资源

mesg += "\nTask" + a;
实际上:

mesg = mesg + "\nTask" + a;
。。。因此,如果一个任务读取
mesg
,然后另一个任务向其写入新值,那么第一个任务将使用旧值连接字符串,并将其写回变量


避免这种情况的最简单方法是使用锁定,这样一次只有一个线程可以执行修改语句。它可能没有那么优雅,但它应该会删除您当前的竞争条件。

您有几个任务,每个任务都以非原子方式修改相同的共享资源

mesg += "\nTask" + a;
实际上:

mesg = mesg + "\nTask" + a;
。。。因此,如果一个任务读取
mesg
,然后另一个任务向其写入新值,那么第一个任务将使用旧值连接字符串,并将其写回变量


避免这种情况的最简单方法是使用锁定,这样一次只有一个线程可以执行修改语句。它可能没有那么优雅,但它应该会删除您当前的竞争条件。

您有几个任务,每个任务都以非原子方式修改相同的共享资源

mesg += "\nTask" + a;
实际上:

mesg = mesg + "\nTask" + a;
。。。因此,如果一个任务读取
mesg
,然后另一个任务向其写入新值,那么第一个任务将使用旧值连接字符串,并将其写回变量


避免这种情况的最简单方法是使用锁定,这样一次只有一个线程可以执行修改语句。它并不像可能的那样优雅,但它应该可以消除您当前的竞争条件。

我认为有时两个任务试图同时访问“mesg”。用锁试试看

object syncObject = new object();
void makeResult(int a)
{
    lock (syncObject)
    {
        mesg += "\nTask" + a;
    }
}

我认为有时两个任务试图同时访问“mesg”。用锁试试看

object syncObject = new object();
void makeResult(int a)
{
    lock (syncObject)
    {
        mesg += "\nTask" + a;
    }
}

我认为有时两个任务试图同时访问“mesg”。用锁试试看

object syncObject = new object();
void makeResult(int a)
{
    lock (syncObject)
    {
        mesg += "\nTask" + a;
    }
}

我认为有时两个任务试图同时访问“mesg”。用锁试试看

object syncObject = new object();
void makeResult(int a)
{
    lock (syncObject)
    {
        mesg += "\nTask" + a;
    }
}

你能解释一下你的题目和你的问题(如果有的话)之间的关系吗对不起,这是另一个问题。。你能解释一下你的题目和你的问题(如果有的话)之间的关系吗对不起,这是另一个问题。。你能解释一下你的题目和你的问题(如果有的话)之间的关系吗对不起,这是另一个问题。。你能解释一下你的题目和你的问题(如果有的话)之间的关系吗对不起,这是另一个问题。。这需要纠正