我創建了一個允許通過命名管道進行通信的Windows服務。命名管道在Windows服務中拋出異常
此代碼工作得很好,當我寫了一些單元測試,旋轉起來的管道和測試通信,但現在我已經安裝在我的Windows服務相同的代碼我收到以下錯誤:
Exception Info: System.IO.IOException
Stack:
at System.IO.__Error.WinIOError(Int32, System.String)
at System.IO.Pipes.NamedPipeServerStream.Create(System.String, System.IO.Pipes.PipeDirection, Int32, System.IO.Pipes.PipeTransmissionMode, System.IO.Pipes.PipeOptions, Int32, Int32, System.IO.Pipes.PipeAccessRights, SECURITY_ATTRIBUTES)
at System.IO.Pipes.NamedPipeServerStream..ctor(System.String, System.IO.Pipes.PipeDirection, Int32, System.IO.Pipes.PipeTransmissionMode, System.IO.Pipes.PipeOptions, Int32, Int32, System.IO.Pipes.PipeSecurity, System.IO.HandleInheritability, System.IO.Pipes.PipeAccessRights)
at System.IO.Pipes.NamedPipeServerStream..ctor(System.String, System.IO.Pipes.PipeDirection, Int32, System.IO.Pipes.PipeTransmissionMode,
System.IO.Pipes.PipeOptions, Int32, Int32, System.IO.Pipes.PipeSecurity)
at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart(System.Object)
現在我做了一些谷歌搜索,但是我實現了這個(除了ps.AddAccessRule(pa);因爲沒有提及pa是) ,我得到了同樣的錯誤。
這是我對線程的代碼:
var pipeSecurity = new PipeSecurity();
pipeSecurity.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));
pipeSecurity.AddAccessRule(new PipeAccessRule("CREATOR OWNER", PipeAccessRights.FullControl, AccessControlType.Allow));
pipeSecurity.AddAccessRule(new PipeAccessRule("SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow));
var pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.InOut, numThreads, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 1024, 1024, pipeSecurity);
pipeServer.WaitForConnection();
任何幫助將是巨大的。
確定這裏是正在運行的監聽器代碼:
Windows服務:
public static System.Timers.Timer Timer = new System.Timers.Timer();
public void Start()
{
Timer.Elapsed += (HeartBeat);
//Timer.Interval = 100; //Live
Timer.Interval = 2000; //Debug
Timer.Start();
}
public void Stop()
{
Timer.Stop();
}
private static void HeartBeat(object sender, ElapsedEventArgs e)
{
//listen for a message
ListenForMessage();
}
監聽器代碼:
private const String pipeName = "StackOVerFlowPipeCode";
private const int numThreads = 10;
public static void ListenForMessage()
{
int i;
var servers = new Thread[numThreads];
for (i = 0; i < numThreads; i++)
{
servers[i] = new Thread(ServerThread);
servers[i].Start();
}
Thread.Sleep(250);
while (i > 0)
{
for (var j = 0; j < numThreads; j++)
{
if (servers[j] == null) continue;
if (!servers[j].Join(250)) continue;
servers[j] = null;
i--; // decrement the thread watch count
}
}
}
private static void ServerThread(object data)
{
try
{
var pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.InOut, numThreads);
pipeServer.WaitForConnection();
var ss = new StreamString(pipeServer);
ss.WriteString(pipeName);
var message = ss.ReadString();
//DO STUFF HERE WITH MESSAGE
pipeServer.Close();
}
catch (Exception ex)
{
//CRY LIKE A BABY WHO LOST HIS TEDDY
throw ex;
}
}
異常消息發現:所有管道實例都忙。
你應該對你的問題做一個編輯,除非你打算在這裏發佈你的實際代碼,然後把這個標記爲答案,以便其他的SO'ers知道你做了什麼不同的事情,這樣他們也可以學習。只是FYI。 – jcolebrand 2010-10-29 14:26:52
上面的評論解釋了我是如何做到的,與原始問題中的代碼完全相同,但謝謝。 – JamesStuddart 2010-10-29 16:09:55