【问题标题】:How to write a IEnum thread如何编写一个 IEnum 线程
【发布时间】:2015-05-05 02:36:59
【问题描述】:

我正在尝试编写一个小型线程应用程序,并想知道如何将以下 IEnum 实现为thread/threaded?线程的绝对初学者,甚至不确定下面的方法是否可以线程。不胜感激。

    static void Main(string[] args)
    {
        IEnumerable<string> e = Enumerable.Range(1, 100).Select(
            n =>   
              (n % 15 == 0) ? "Fizzbuzz" :
                  (n % 3 == 0) ? "Fizz" :
                      (n % 5 == 0) ? "buzz" :
                          n.ToString())
                           .ToList();
        WriteFile(e);
    }
    private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim();
    private static void WriteFile(IEnumerable<string> text)
    {
        _readWriteLock.EnterWriteLock();
        string path = @"C:\Users\Desktop\Test.txt";
        try
        { 
            using (StreamWriter stream = File.AppendText(path))
            {
                    foreach (var item in text)
                    {
                        stream.WriteLine(item); 
                    }
                stream.Close();
            }
        }
        catch (Exception e)
        {
            throw (e);
        }
        finally
        {
                    // Release lock
                    _readWriteLock.ExitWriteLock();
        }
    }

【问题讨论】:

  • 首先,你没有使用线程,所以你不需要担心线程安全。其次,您只是从集合中读取,并且在定义后从不写入它,因此无论如何都不必担心来自其他线程的修改......
  • 对不起,我应该重新定义我的问题,我怎样才能使 IEnum 线程化?以前从未尝试过线程应用程序,只是想知道它是如何完成的,使用上面的示例。
  • 请不要编码catch (Exception e) { throw (e); }。这是一种糟糕的做法,只会提供一个错误可以滋生的环境。
  • 当“使 IEnum 线程化”时,您希望枚举做哪些不同的事情?
  • 有类似的问题stackoverflow.com/questions/5061761/…(也谈到了async,但至少它可能是有趣的)。

标签: c# multithreading thread-safety locking


【解决方案1】:

这对你有用吗?

static void Main(string[] args)
{
    IEnumerable<string> e =
        Enumerable
            .Range(1, 100)
            .AsParallel()
            .Select(
                n =>   
                    (n % 15 == 0) ? "Fizzbuzz" :
                    (n % 3 == 0) ? "Fizz" :
                    (n % 5 == 0) ? "buzz" :
                    n.ToString())
            .ToList();
    WriteFile(e);
}

private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim();
private static void WriteFile(IEnumerable<string> text)
{
    try
    {
        _readWriteLock.EnterWriteLock();
        File.AppendAllLines(@"C:\Users\Desktop\Test.txt", text);
    }
    finally
    {
        _readWriteLock.ExitWriteLock();
    }
}

注意.AsParallel() 调用。

但是,如果你这样做,那么就不需要锁了。

【讨论】:

  • 如果范围更大,这种方法会更快吗?
  • @GarrithGraham - 不。您的计算速度非常快,因此线程不太可能加快速度。如果您正在计算一些耗时的东西,那么线程将非常有用。
  • 谢谢,这让我们很难知道何时何地使用线程。正如我在帖子中提到的,完全的初学者只是一个短暂的兴趣。
  • @GarrithGraham - 你应该几乎总是避免线程。它经常使您的代码难以理解、调试和管理 - 而且通常没有您想象的那么快。
  • @GarrithGraham - 你最好使用异步而不是显式多线程。使用async/await,或者任务或响应式框架是一个更好的主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2015-11-02
  • 2017-04-08
  • 1970-01-01
相关资源
最近更新 更多