2015-05-05 28 views
0

我正在尝试编写一个小型线程应用程序,并想知道如何实现以下IEnum作为thread/threaded?绝对初学者线程化,甚至不确定下面的方法可以被线程化。希望有一点通过。如何编写IEnum线程

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(); 
     } 
    } 
+1

首先,你不使用线程,所以你不必担心线程安全。其次,你只是从集合中读取数据,并且在定义之后从不写信给它,所以不用担心其他线程的修改...... –

+0

对不起,我应该重新定义我的问题,我怎样才能让IEnum线程化?从来没有尝试过一个线程化的应用程序,只是想知道它是如何完成的,使用上面的例子。 –

+0

请不要编码catch(Exception e){throw(e); }'。这是一个糟糕的做法,只会提供一个可以滋生虫子的环境。 – Enigmativity

回答

2

这是否适合您?

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()

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

+0

如果范围大得多,这种方法会更快吗? –

+0

@GarrithGraham - 不,你的计算速度非常快,所以线程很难加速。如果你正在计算耗费时间的东西,那么线程将非常有用。 – Enigmativity

+0

谢谢,它让我们很难知道何时何地使用线程。正如我在帖子中提到的,完全初学者只是传递兴趣。 –