.net 多个任务并行-一个部分“一个接一个”

b4wnujal  于 2023-01-27  发布在  .NET
关注(0)|答案(1)|浏览(139)

我有几个任务并行运行同一个方法。对于这个方法的一个特定部分。我希望任务一个接一个地进行(不是并行的)。
背景:在特定的部分中,我打开了另一个表单,用户在其中输入密码。我不希望用户为每一个任务输入密码。第一个密码应该保存在一个全局字符串中,并由其他任务使用。

private void S7_GetCPU()
{
    //Some Stuff

    if (CPUPassword != null)
    {
        EncryptedString pwd = new EncryptedString(CPUPassword);
        this.CPU.SetPassword(pwd);
    }
    if (!this.CPU.PasswordValid)
    {
        CPUPassword = ((MainForm)mainform)
            .ShowInputMessage("Enter Password for CPU"), true);
        EncryptedString pwd = new EncryptedString(CPUPassword);
        this.CPU.SetPassword(pwd);
    }

    //More Parallel-Stuff
}

我试着把这个部分放到一个Invoke中。Input-Message只打开一次。但是所有其他的任务都冻结在那一点上,甚至在第一个任务离开.invoke之后

private void S7_GetCPU()
{
    //Some Stuff
    this.Invoke(new System.Action(() =>
    {
        if (CPUPassword != null)
        {
            EncryptedString pwd = new EncryptedString(CPUPassword);
            this.CPU.SetPassword(pwd);
        }
        if (!this.CPU.PasswordValid)
        {
            CPUPassword = ((MainForm)mainform)
                .ShowInputMessage("Enter Password for CPU"), true);
            EncryptedString pwd = new EncryptedString(CPUPassword);
            this.CPU.SetPassword(pwd);
        }
    }));
    //More Parallel-Stuff
}
fwzugrvs

fwzugrvs1#

解决方法:lock

private static readonly object PWLock = new object();

private void S7_GetCPU()
{
    //Some Stuff
    lock(PWLock)
    {
        if (CPUPassword != null)
        {
            EncryptedString pwd = new EncryptedString(CPUPassword);
            this.CPU.SetPassword(pwd);
        }
        if (!this.CPU.PasswordValid)
        {
            CPUPassword = ((MainForm)mainform)
                .ShowInputMessage("Enter Password for CPU"), true);
            EncryptedString pwd = new EncryptedString(CPUPassword);
            this.CPU.SetPassword(pwd);
        }
    }));
    //More Parallel-Stuff
}

相关问题