C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 线程同步打印字符串大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个@R_404_2479@,打印“x”,然后是“”,然后再打印“x”,依此类推.
我的想法是让它在两个线程中运行,以便一个线程打印“x”,第二个线程打印“”.输出如下所示:
“x” – >线程号1
“” – >线程号2
“x” – >线程编号1enter代码在这里
“” – >线程号2
等等..

我写的内容似乎工作正常,但在我看来它是写的
非常老式的方式:

public class Example
 {
    private static @R_450_3867@ = 10;
    private static int i = 0;
    private static bool isOneActive = false;


  private static void Run1(object o)
  {
      String s = o as String;

      while(true)
      {
          if (!isOneActivE)
          {
              Console.WriteLine("Hello from thread number: " +   
                      Thread.CurrentThread.ManagedThreadId + " -> " + s);
              isOneActive = true;
              if (i++ > count) break;
          }
      }
  }

  private static void Run2(object o)
  {
      String s = o as String;

      while(true)
      {
          if (isOneActivE)
          {
              Console.WriteLine("Hello from thread number: " + 
                Thread.CurrentThread.ManagedThreadId + " -> " + s);
              isOneActive = false;
              if (i++ > count) break;
          }
      }
  }

  static void Main()
  {
      Thread t1 = new Thread(Run1);
      Thread t2 = new Thread(Run2);
      t1.Start("x");
      t2.Start("+");
  }

我知道现在.NET有许多用于线程同步的工具,例如ManualResetEvent类和Task库.那么我们如何使用ManualResetEvent类编写相同的程序呢?有可能吗?

解决方法

你的代码不仅老式,效率很低.它无缘无故地旋转,只能等待;这应该尽可能避免被称为 Busy wait.

更好的方法是使用@L_675_11@中提到的Waithandles.

一个简单的实现,代码变化很小,如下所示.

public class Example
{
    private static @R_450_3867@ = 10;
    private static int i = 0;
    private static AutoResetEvent firstEvent = new AutoResetEvent(true);
    private static AutoResetEvent secondEvent = new AutoResetEvent(false);


    private static void Run1(object o)
    {
        String s = o as String;

        while (true)
        {
            firstEvent.WaitOne();
            Console.WriteLine("Hello from thread number: " + Thread.CurrentThread.ManagedThreadId + " -> " + s);
            secondEvent.Set();
            if (Interlocked.Increment(ref i) > count)
                break;
        }
    }

    private static void Run2(object o)
    {
        String s = o as String;

        while (true)
        {
            secondEvent.WaitOne();
            Console.WriteLine("Hello from thread number: " + Thread.CurrentThread.ManagedThreadId + " -> " + s);
            firstEvent.Set();
            if (Interlocked.Increment(ref i) > count)
                break;
        }
    }

    static void Main()
    {
        Thread t1 = new Thread(Run1);
        Thread t2 = new Thread(Run2);
        t1.Start("x");
        t2.Start("+");
    }
}

请注意,firstEvent是在initialState标志设置为true的情况下实例化的,这意味着第一个线程最初不会等待.

大佬总结

以上是大佬教程为你收集整理的c# – 线程同步打印字符串全部内容,希望文章能够帮你解决c# – 线程同步打印字符串所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。