请大侠帮忙看看,这段代码存在着哪些潜在的问题。谢谢!
class Program
{
static void Main(string[] args)
{
try
{
Thread t1 = new Thread(Logger.Write);
t1.Name = "t1";
Thread t2 = new Thread(Logger.Write);
t2.Name = "t2"; t1.Start();
t2.Start(); }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
class Logger
{
const int C = 10; public static void Write()
{
using (FileStream fs = new FileStream("c:\\a.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
int i = 0; while (i < C)
{
// 下行代码如果注释,可以运行,但不知道是否存在潜在的问题。
//Thread.Sleep(100);
sw.WriteLine(Thread.CurrentThread.Name + " -- " + DateTime.Now.ToLocalTime());
i++;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{
try
{
Thread t1 = new Thread(Logger.Write);
t1.Name = "t1";
Thread t2 = new Thread(Logger.Write);
t2.Name = "t2"; t1.Start();
t2.Start(); }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
class Logger
{
const int C = 10; public static void Write()
{
using (FileStream fs = new FileStream("c:\\a.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
int i = 0; while (i < C)
{
// 下行代码如果注释,可以运行,但不知道是否存在潜在的问题。
//Thread.Sleep(100);
sw.WriteLine(Thread.CurrentThread.Name + " -- " + DateTime.Now.ToLocalTime());
i++;
}
}
}
}
}
解决方案 »
- 求正则表达式,将<table>...</table>中的HTML代码过滤成“<table><tr><td>单元格内容</td></tr></table>”
- 问:关于Nbear框架
- 救命啊,加密不行啦
- 100分,谁帮我把这段VC代码转成C#代码,100分
- 刚开始设计软件,想听听各位的建议.
- 如何让一上框内的页面控制另一框架显示(关联)的页面??
- 谁会做QQ群发邮件的
- 保存datagridvie中的数据
- 如果和web control的Textbox中强制输入数字??
- .NET 动态焦点问题
- [1000元有偿提问] 如何用 C#(vb.net) + webbrowser 一分钟注册 4 个淘宝账号?欢迎CSDN高手研究并解答,RMB酬谢!
- (急)网站发布问题
{
StreamReader TxtReader = new StreamReader(@"D:\Documents and Settings\Administrator\桌面\NewText1\1.txt", System.Text.Encoding.Default);
string strFileContent = TxtReader.ReadToEnd(); TxtReader.Close(); StreamWriter TxtWriter = new StreamWriter(@"D:\Documents and Settings\Administrator\桌面\NewText1\1.txt", true, System.Text.Encoding.Default);
TxtWriter.Write(strFileContent);//改写的对象
TxtWriter.Close();
MessageBox.Show("文件打开成功");
}
catch (Exception)
{
MessageBox.Show("文件打开失败");
}
最好加锁。
你的StreamWriter sw 没有关闭啊,这很严重的
或者有个类可以实现多线程同时读,单线程写入的功能
对于如何控制资源,我只有概念性的认识也没研究过,你可以查一些资料,不是信号量,邮箱,互斥体等等
比如同时写文件应该有一定的规则吧,比如一替一行的写,你控制一个bool型变量,其中一个写的时候另一个设置为就绪状态。只能提供一下思路。
另外,记得关闭资源。
这个能具体点吗?谢谢!
static class Logger
{
private const int C = 10;
private static readonly object locker = new object(); public static void Write()
{
lock (locker)
{
using (FileStream fs = new FileStream("e:\\a.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
int i = 0; while (i < C)
{
Thread.Sleep(100);
sw.WriteLine(Thread.CurrentThread.Name + " -- " + DateTime.Now.ToLocalTime());
i++;
}
}
}
}
}
}
个人认为是线程同步的问题, 文件被一个线程以写方式打开, 另一个写方式打开的尝试应该会被拒绝, 故报错
简单点的方式是public static void Write()
{
static object l_obj = new object();
lock (l_obj) {
using (FileStream fs = new FileStream("c:\\a.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
int i = 0; while (i < C)
{
// 下行代码如果注释,可以运行,但不知道是否存在潜在的问题。
//Thread.Sleep(100);
sw.WriteLine(Thread.CurrentThread.Name + " -- " + DateTime.Now.ToLocalTime());
i++;
}
}
}
}
}
private Mutex mWriter = null;
//你的方法
if (mWriter == null) mWriter = new Mutex();
mWriter.WaitOne();
try
{
//your code
}
catch
{
}
mWriter.ReleaseMutex();//
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
namespace ConsoleApplication7 {
class Program {
static void Main(string[] args) {
try {
Thread t1 = new Thread(Logger.Write);
t1.Name = "t1";
Thread t2 = new Thread(Logger.Write);
t2.Name = "t2";
Thread t3 = new Thread(Logger.Write);
t3.Name = "t3"; t1.Start();
t2.Start();
t3.Start(); }
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}
}
class LoggerText:IDisposable
{
static private LoggerText _instance;
static private object _lockObj;
static private object _lockInstanceObj = new object();
private FileStream _fs;
private StreamWriter _sw;
private LoggerText(){
_fs = new FileStream("c:\\a.txt", FileMode.OpenOrCreate, FileAccess.Write);
_sw = new StreamWriter(_fs);
_lockObj = new object();
}
public void wirteIn(string text){
lock(_lockObj)
{
_sw.WriteLine(text);
_sw.Flush();
}
}
static public LoggerText Instance(){
lock (_lockInstanceObj) {
if (_instance == null) {
_instance = new LoggerText();
}
}
return _instance;
} #region IDisposable Members void IDisposable.Dispose() {
_sw.Close();
_fs.Close();
} #endregion
}
class Logger {
const int C = 1000;
public static void Write() {
int i = 0;
while (i < C) {
// 下行代码如果注释,可以运行,但不知道是否存在潜在的问题。
//Thread.Sleep(100);
LoggerText.Instance().wirteIn(Thread.CurrentThread.Name + " -- " + DateTime.Now.ToLocalTime() + " -- " + i.ToString());
i++;
}
}
}
}
注意 单例LoggerText在应用开始时初始化(Instance)在应用结束时干掉(Dispose())
try {
for (int i = 1; i < 100; i++) {
Thread t = new Thread(Logger.Write);
t.Name = "t"+i.ToString();
t.Start();
}
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}