C# 多线程程序逻辑

C# 多线程程序逻辑,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我的教授给了我这个半伪代码。他说我应该在这个代码的逻辑中找到一个错误。目前我什么也找不到,可能是什么问题。你能不能给我一些提示,告诉我可能出了什么问题?我不是在问答案,因为我想自己找到答案,但一些我应该朝哪个方向看的提示会很棒 class Program { int progressValue = 0; int totalFiles = 0; int i = 0; bool toContinue = true; void MasterThread() {

我的教授给了我这个半伪代码。他说我应该在这个代码的逻辑中找到一个错误。目前我什么也找不到,可能是什么问题。你能不能给我一些提示,告诉我可能出了什么问题?我不是在问答案,因为我想自己找到答案,但一些我应该朝哪个方向看的提示会很棒

class Program
{
    int progressValue = 0;
    int totalFiles = 0;
    int i = 0;
    bool toContinue = true;

void MasterThread()
{
    Thread thread1 = new Thread(Worker1);
    Thread thread2 = new Thread(Worker2);
    Thread progressThread = new Thread(ProgressThread);

    thread1.Start();
    thread2.Start();
    progressThread.Start();
}

void Worker1()
{
    string[] files = Directory.GetFiles(@"C:\test1");
    totalFiles += files.Length;
    foreach (string file in files)
    {
        Encryption.Encrypt(file);
        i++;
        progressValue = 100 * i / totalFiles;
    }
    toContinue = false;
}

void Worker2()
{
    string[] files = Directory.GetFiles(@"C:\test2");
    totalFiles += files.Length;
    foreach (string file in files)
    {
        Encryption.Encrypt(file);
        i++;
        progressValue = 100 * i / totalFiles;
    }
    toContinue = false;
}

void ProgressThread()
{
    while (toContinue == true)
    {
        Update(progressValue);
        Thread.Sleep(500);
    }
  }
}

有几个,;我将列举两个明显的例子,我想这不是如何编写精确和正确的多线程代码的练习

你应该问自己以下问题:

  • progressValue
    应该测量总工作量的0到100之间的进度(进度值等于150似乎有点不合适,不是吗?)。真的是这样吗
  • 在所有工作完成之前,不应停止更新
    progressValue
    Update(progressValue)
    )。你真的这么做了吗

  • 我对多线程不太了解,但我会尝试给出一些提示。 首先看看全局变量,当您在不同线程中访问同一个变量时会发生什么

    除了另一个答案上的提示之外,我找不到任何其他“错误”

    这是在第一个完成线程的末尾设置的-这将导致ProgressThread在第一个线程完成后立即停止,而不是在两个线程都完成时停止。应该有两个单独的线程完成标志,并且两个都应该被检查。

    为了补充已经提供的好答案,我有点透彻了,但我的想法是学习

    异常处理

    可能是异常处理的问题。始终检查程序中可能出现意外结果的位置。
    如果此变量的值不是我们期望的值,那么此代码将如何运行?
    如果我们除以零会发生什么?
    诸如此类的事情

    看看在哪里初始化变量,问问你自己,这是否有可能不会按照预期的方式初始化

    方法调用

    还可以查看代码中使用的所有库。e、 g.加密。
    问问你自己,这些陈述会给我一个预期的结果吗? e、 g

    这会返回字符串数组吗?
    这就是初始化字符串数组的方式吗

    电话质询: e、 g

    这到底有什么用

    线程化

    这样调用三个线程将如何工作。
    它们需要协调吗?
    线程是否应该休眠以允许其他操作完成

    也可用于从不同线程访问变量。
    试图跟踪该变量的值是否会出现混乱?
    它们是否被覆盖


    命名约定

    在一个较小的注释中,C#中的命名约定存在问题。在C#中,使用泛型
    var
    的隐式类型比显式类型声明更可取

    我并不是说所有这些观点都有问题,但如果您调查所有这些观点以及其他答案中的观点,您将发现所有错误,并更好地理解您正在阅读的代码。

    以下是项目:

  • 主线程
    ”上没有任何内容,因此很难判断程序是否会立即结束
  • 从两个线程访问
    totalFiles
    ,如果两个线程同时访问,则其中一个线程或另一个线程可能会获胜(或者两个线程都可能部分更新该值),因此无法判断您是否拥有有效值<代码>联锁.Add(参考totalFiles,files.Length)
  • 两个工作线程也会更新
    i
    ,这也可能会损坏<代码>联锁增量(参考i)
  • 无法判断
    加密。Encrypt
    是否是线程安全的。可能应该使用
  • ProgressThread
    中的循环是坏的-
    Thread。应始终避免睡眠
    ——最好使用显式更新调用(或其他机制)来更新进度
  • 无法判断
    是否更新(progressValue)是线程安全的。可能应该使用

  • 谢谢你强调这两个问题,我将研究它们。实际上,这个主题被称为多线程编程,所以它可能是多线程部分逻辑中的一些错误。您能看到任何?对变量的并发访问吗?感谢所有人的回答以及您花在回答和尝试帮助我上的时间!我一定会调查你指出的所有事情!谢谢
    toContinue = false;
    
    string[] files = Directory.GetFiles(@"C:\test1");
    
     Update(progressValue);