- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在使用 WPF 应用程序时,我遇到了一个非常疯狂的问题,该应用程序使用 Singleton 实例模式来确保只有一个实例在运行。单个实例检测和命令行转发机制工作正常,但是,作为在辅助实例上退出的启动代码的一部分,将文件写入磁盘,主应用程序通过 FileWatcher
获取该文件。辅助实例经常严重崩溃并出现内核级错误。
检查辅助实例并随机崩溃的启动代码是这样做的:
protected override void OnStartup(StartupEventArgs e)
{
bool isOnlyInstance = false;
Mutex = new Mutex(true, @"MarkdownMonster", out isOnlyInstance);
if (!isOnlyInstance)
{
filesToOpen = " ";
var args = Environment.GetCommandLineArgs();
if (args != null && args.Length > 1)
{
StringBuilder sb = new StringBuilder();
for (int i = 1; i < args.Length; i++)
{
sb.AppendLine(args[i]);
}
filesToOpen = sb.ToString();
}
File.WriteAllText(mmApp.Configuration.FileWatcherOpenFilePath, filesToOpen);
Mutex.Dispose();
// This blows up when writing files and file watcher watching
// No idea why - Environment.Exit() works with no issue
ShutdownMode = ShutdownMode.OnMainWindowClose;
App.Current.Shutdown();
return;
}
// ...
}
检查写入文件的代码加载到主窗体的构造函数中:
openFileWatcher = new FileSystemWatcher(
Path.GetDirectoryName(mmApp.Configuration.FileWatcherOpenFilePath),
Path.GetFileName(mmApp.Configuration.FileWatcherOpenFilePath))
{
NotifyFilter = NotifyFilters.LastWrite,
EnableRaisingEvents = true
};
openFileWatcher.Changed += openFileWatcher_Changed;
openFileWatcher.Created += openFileWatcher_Changed;
然后处理程序会像这样检查文件:
private void openFileWatcher_Changed(object sender, FileSystemEventArgs e)
{
string filesToOpen = null;
// due to write timing we may have to try a few times
for (int i = 0; i < 100; i++)
{
try
{
if (File.Exists(mmApp.Configuration.FileWatcherOpenFilePath))
{
filesToOpen = File.ReadAllText(mmApp.Configuration.FileWatcherOpenFilePath);
File.Delete(mmApp.Configuration.FileWatcherOpenFilePath);
filesToOpen = filesToOpen.TrimEnd();
}
break;
}
catch
{
Thread.Sleep(10);
}
}
Dispatcher.Invoke(() =>
{
if (!string.IsNullOrEmpty(filesToOpen))
{
foreach (var file in StringUtils.GetLines(filesToOpen))
{
MessageBox.Show(file);
this.OpenTab(file.Trim());
}
}
if (WindowState == WindowState.Minimized)
WindowState = WindowState.Normal;
this.Activate();
});
}
所有这一切的逻辑工作正常。应用程序正确检测到始终写出文件的辅助实例,第一个实例拾取文件并激活/加载命令行中指定的文件。
但是,辅助实例崩溃硬并出现无法捕获的错误(AppDomain.UnhandledException
事件已 Hook 但未触发),会弹出一个 Windows 错误对话框到桌面。
次级加载在启动时大约有 80% 的时间崩溃 - 这不一致,但频率更高。
如果我删除 File.WriteAllText() 代码,则不会发生崩溃。如果我删除 FileWatcher 代码,则不会发生崩溃。如果两者都处于事件状态:Boom。 IOW,文件写入和 FileWatcher 都需要发生才能崩溃——如果一个不活动,则不会发生崩溃。我试过用 try/catch 包装 File.WriteAllText() 调用,但它没有被触发。代码退出我的用户函数后发生故障,我似乎无法控制该错误。
其他异常:
我还尝试用 Environment.Exit()
替换 App.Current.Shutdown()
代码,这更好 - 崩溃频率要低得多,但它们 仍有 10% 的时间发生。
当所有辅助实例都在将文件写入磁盘时,是什么导致了应用程序的硬崩溃?
更新
所以事实证明,崩溃问题根本与文件写入/FileWatcher 操作无关。我创建了相同代码的 NamedPipe 版本,但仍然失败。
事实证明,真正的罪魁祸首是 WPF 在启动时用于将图像启动到屏幕的 SplashScreen。虽然不是 WPF 术语中的完整“窗口”,但此窗口在新线程上启动并在完全初始化之前提前关闭会在 SplashScreen 线程完成之前终止应用程序,从而导致内核崩溃。解决方法是 a) 删除启动画面,b) 手动管理启动画面并且不显示它以便提前退出或 c) 在退出之前明确关闭启动画面:
SplashScreen.Close(TimeSpan.MinValue);
Environment.Exit(0);
我写了一篇博文,部分更详细地介绍了这个问题:
最佳答案
尝试改用 FileStream,然后您可以确保使用 FileStream.Flush 关闭文件句柄
using (FileStream fs = File.Create(mmApp.Configuration.FileWatcherOpenFilePath))
{
byte[] info = new UTF8Encoding(true).GetBytes(filesToOpen);
fs.Write(info, 0, info.Length);
fs.Flush();
}
关于c# - WPF App.OnStartup() 在写入文件和 FileWatcher 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37179821/
我正在使用 .net filewatcher 监视某个文件夹以获取某些类型的文件 (*.mbxml)。我正在使用 filewatcher 创建的事件。一旦创建的事件触发,我必须将此文件移动到另一个文件
下面是我编写的文件观察器类的代码: class FileWatcher { #region Method that begins watching public static v
我正在构建一个应用程序,我将在其中查看文件。我对编程很陌生,所以我(也许)没有什么问题,因为我没有真正的实践。我的程序可以正常工作,但我不知道在“真实”软件中通常是如何实现的。请概述和评论。因为我喜欢
尝试编译 .less 时我做错了什么文件到 .css使用 PHPStorm 文件观察器? 这是屏幕截图,(请打开 THIS LINK 以查看图像的完整尺寸): 我安装了 npm install -g
在 Java 中,我正在使用介绍的过程 here 。当我与文件交互时一切正常,但在处理文件夹时遇到问题。该代码确实检测到已添加/修改了新文件夹等,但它没有告诉我这是一个文件夹而不是文件。 它会说“fo
我想用 powershell 查看文件夹,并且我是 PS 初学者。 当我启动脚本时,该脚本只能运行一次。 但是当我因为更改了一些脚本代码而必须再次重新启动脚本时,我收到此错误消息: Cannot su
我正在尝试将多线程与java中的FileWatcher服务集成。即,我不断地监听特定目录 -> 每当创建新文件时,我需要生成一个处理该文件的新线程(假设它打印文件内容)。我设法编写了一个可以编译并运行
我制作了一个 FileWatcher,但我的 FileWatcher 没有按计划工作,我卡住了。 我想要一个可以处理 2 个 map 的文件观察器。 我自己做的代码不会选择我说他应该选择的路径。 在我
我想知道是否在给定目录中创建了新文件。我有下一个代码: private static void CreateWatcher() { //Create a new FileSys
我在我的 winform 应用程序中使用 filewatcher 控件。我正在通过处理其事件来执行上传任务。 现在的问题是,当我在目录(在 FileWatcher 控制下监视)中创建任何新文档时,上传
我是 Rx 的新手,希望在我当前的项目中使用它。我正在尝试实现一个文件观察器系统。至少现在我只对文件创建事件感兴趣。但是当我试图在代码下面运行时,我收到“值不能为空错误消息”。请有人帮我解决以下代码。
这是来自 FileWatcher java 7 nio 库的代码片段。它是非阻塞代码吗?该线程等待来自文件系统的信号。 for (;;) { // wait for key to be sig
我想在 IntelliJ 中使用 SCSS 文件。我看到 tutorial我试着跟着它。但出于某种原因,这对我不起作用。 我做了什么: (我有一台mac电脑)我下载节点 sass 库:npm inst
第一次发布长期读者。 我在 Windows 窗体应用程序中构建了一个工作文件观察器,在将其移动到 Windows 服务之前 100% 正常运行,现在我收到两个单独的问题。此文件观察器读取平面文件以进行
我正在使用 .net 2.0 filewatcher 来监视文件夹中的新文件。它工作得很好,除非我一次放置超过 80 个文件。该事件不再触发。就好像 filewatcher 被设置为跟踪一定数量的文件
我在尝试使用 WebStorm LESS File Watcher 时遇到此错误 /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/
在使用 WPF 应用程序时,我遇到了一个非常疯狂的问题,该应用程序使用 Singleton 实例模式来确保只有一个实例在运行。单个实例检测和命令行转发机制工作正常,但是,作为在辅助实例上退出的启动代码
几天前我开始使用 Rider,我想开始在我的元素中使用 SCSS 并将它们编译回 CSS,我正在摆弄文件观察器,但我无法让它工作,我一直收到这个当我将“显示控制台”设置为“始终”时,控制台中会显示消息
几天前我开始使用 Rider,我想开始在我的元素中使用 SCSS 并将它们编译回 CSS,我正在摆弄文件观察器,但我无法让它工作,我一直收到这个当我将“显示控制台”设置为“始终”时,控制台中会显示消息
我开发了一个filewatcher程序来监控一个文件夹,如果文件有任何变化,它会把文件复制到另一个文件夹。 但是我发现在写入原始文件时会出现错误信息(例如文件正在被另一个应用程序处理......)似乎
我是一名优秀的程序员,十分优秀!