我试图阻止Silverlight OOB应用程序打开两次,但我不知道如何。
我尝试在应用程序启动后使用“FileShare.None”直接创建FileStream,当应用程序打开两次并尝试打开文件时抛出错误,但它的丑陋并且因为FileStream似乎不起作用大约30秒后被释放..
FileStream s2 = new FileStream(path, FileMode.OpenOrCreate,FileAccess.ReadWrite, FileShare.None);
知道我怎么能接近这个吗?
谢谢,phil
答案 0 :(得分:1)
实现此目的的一种方法是使用Silverlight应用程序之间的本地消息传递通道。 MSDN中提到了这种情况,我将在这里进一步扩展。
LocalMessageReceiver类允许您注册主要用于在不同Silverlight应用程序之间进行通信的消息服务。
诀窍是你只能在特定范围内使用相同的名称注册一次。因此,如果第一个实例使用您的应用程序名称注册自己,那么之后执行相同操作的任何其他实例都将触发异常。然后你必须捕获异常并处理它,具体取决于你想做什么(关闭实例,显示消息等)。
这是我使用的代码:
private bool CheckSingleInstance()
{
try
{
var receiver = new LocalMessageReceiver("application name", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);
receiver.Listen();
return true;
}
catch (ListenFailedException)
{
// A listener with this name already exists
return false;
}
}
此解决方案的一个优点是,无论您的实例是在浏览器中还是在浏览器外,它都能正常工作。