【发布时间】: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