我正在通过以下方式从ASP.NET Web窗体启动控制台应用程序,这是从Button控件的Click事件处理程序调用的:
Process p = new Process();
p.StartInfo.FileName = @"C:\HiImAConsoleApplication.exe";
// Set UseShellExecute to false for redirection.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.Arguments = "-u " + url + " -p BLAH";
p.StartInfo.CreateNoWindow = false;
// Set our event handler to asynchronously read the sort output.
p.OutputDataReceived += OutputReceived;
// Start the process.
p.Start();
// Start the asynchronous read of the sort output stream.
p.BeginOutputReadLine();
p.WaitForExit();
这很好,我正在使用OutputDataReceived事件处理程序,通过将接收到的消息添加到全局定义的字符串集合中来毫无问题地从控制台应用程序中读取输出,然后在计时器上从WebMethod中获取新消息。
protected static void OutputReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
messages.Add(myData);
}
if (messages.Count > 20)
{
messages.Clear();
}
}
,然后通过WebMethod检查消息:
public static List<string> messages = new List<string>();
[WebMethod]
public static string[] CheckForNewMessages()
{
List<string> tempCollection = new List<string>();
if (messages.ToArray().Length > 0)
{
foreach (string str in messages.ToArray())
{
tempCollection.Add(str);
}
}
return tempCollection.ToArray();
}
这种方法的问题是,如果我有多个用户尝试使用该应用程序,他们显然会彼此共享消息,那不是很好。我想知道是否有更好的方法可以使我更准确地支持多个用户。
TIA专家!
答案 0 :(得分:1)
您可以使用词典,并将用户的Cookie与可以阅读的消息连接起来。
public static Dictionary<string, string> messages = new Dictionary<string, string>();
密钥,必须是用户cookie。
错误1,在回收池中,您丢失了数据。
错误2,在您网站的任何更新/编译上,都会丢失数据。
错误3,当您有多个池(网络花园)时,每个池都有其静态数据,因此同一用户可能会丢失/从不查看其数据。
正确的方法是使用数据库,或者将某些文件记录下来-并将消息与用户Cookie /用户ID连接起来