本人目前用的是信号量和共享内存来实现的,但是当快速运行多个exe(这里是6个)时,会出现问题,请帮小弟解决一下,或者有好的方法或建议请回复一下. public static Semaphore semNew1 = null; public static Semaphore semOpen1 = null; public static void opn(object strObj)
{
try
{ byte[] byData;
char[] charData; string fileName = "C:\\NEXCO\\LOG\\test.txt";
FileStream objFileStream = new FileStream(fileName, FileMode.Append, FileAccess.Write); //获得字符数组
string str = Convert.ToString(strObj);
charData = str.ToCharArray();
//初始化字节数组
byData = new byte[charData.Length];
//将字符数组转换为正确的字节格式
Encoder enc = Encoding.UTF8.GetEncoder();
enc.GetBytes(charData, 0, charData.Length, byData, 0, true); // objFileStream.Seek(0, SeekOrigin.Begin);
objFileStream.Write(byData, 0, byData.Length);
Console.WriteLine("1!");
Thread.Sleep(6000);
Console.WriteLine("2!");
objFileStream.Close();
}
catch (Exception ex)
{
Console.WriteLine("File is being used!");
} }
static void Main(string[] args)
{ //GetLuckNo(); //スレッドプールを作成し、引数を転送する
ShareMem MemDB = new ShareMem();
byte[] bytData = new byte[1]; if (MemDB.Init("MemTest", 1) != 0)
{
//共享内存初始化失败
Console.WriteLine("初始化失败");
}
else
{
// MessageBox.Show("初始化成功");
int intRet = MemDB.Read(ref bytData, 0, 1); if (bytData[0] == 0)
{
bytData[0] += 1;
MemDB.Write(bytData, 0, 1);
semNew1 = new Semaphore(0, 10, "SemaphoreShare");
semOpen1 = Semaphore.OpenExisting("SemaphoreShare");
string str = "hello:" + DateTime.Now.ToString() + "\n";
opn(str);
bytData[0] -= 1;
MemDB.Write(bytData, 0, 1);
}
else
{
bytData[0] += 1;
MemDB.Write(bytData, 0, 1);
semOpen1 = Semaphore.OpenExisting("SemaphoreShare");
semOpen1.WaitOne();
string str = "nihao:" + DateTime.Now.ToString() + "\n";
opn(str);
bytData[0] -= 1;
MemDB.Write(bytData, 0, 1);
}
semOpen1.Release();
} Console.Read();
}
{
try
{ byte[] byData;
char[] charData; string fileName = "C:\\NEXCO\\LOG\\test.txt";
FileStream objFileStream = new FileStream(fileName, FileMode.Append, FileAccess.Write); //获得字符数组
string str = Convert.ToString(strObj);
charData = str.ToCharArray();
//初始化字节数组
byData = new byte[charData.Length];
//将字符数组转换为正确的字节格式
Encoder enc = Encoding.UTF8.GetEncoder();
enc.GetBytes(charData, 0, charData.Length, byData, 0, true); // objFileStream.Seek(0, SeekOrigin.Begin);
objFileStream.Write(byData, 0, byData.Length);
Console.WriteLine("1!");
Thread.Sleep(6000);
Console.WriteLine("2!");
objFileStream.Close();
}
catch (Exception ex)
{
Console.WriteLine("File is being used!");
} }
static void Main(string[] args)
{ //GetLuckNo(); //スレッドプールを作成し、引数を転送する
ShareMem MemDB = new ShareMem();
byte[] bytData = new byte[1]; if (MemDB.Init("MemTest", 1) != 0)
{
//共享内存初始化失败
Console.WriteLine("初始化失败");
}
else
{
// MessageBox.Show("初始化成功");
int intRet = MemDB.Read(ref bytData, 0, 1); if (bytData[0] == 0)
{
bytData[0] += 1;
MemDB.Write(bytData, 0, 1);
semNew1 = new Semaphore(0, 10, "SemaphoreShare");
semOpen1 = Semaphore.OpenExisting("SemaphoreShare");
string str = "hello:" + DateTime.Now.ToString() + "\n";
opn(str);
bytData[0] -= 1;
MemDB.Write(bytData, 0, 1);
}
else
{
bytData[0] += 1;
MemDB.Write(bytData, 0, 1);
semOpen1 = Semaphore.OpenExisting("SemaphoreShare");
semOpen1.WaitOne();
string str = "nihao:" + DateTime.Now.ToString() + "\n";
opn(str);
bytData[0] -= 1;
MemDB.Write(bytData, 0, 1);
}
semOpen1.Release();
} Console.Read();
}
{
int tms = 0;
begin:
try
{
var objFileStream = new FileStream(path, FileMode.Append, FileAccess.Write);
return objFileStream;
}
catch (IOException ex)
{
if (++tms < 20)
{
Thread.Sleep(800);
goto begin;
}
else
throw ex;
}
}
多个进程访问文件时,进程自己去执行 Thread.Sleep(立刻交还CPU控制),这就是在排队。