我要处理的是其他一些非常不稳定且非常容易崩溃的应用程序。
这是我当前的设置,执行本身发生在T中:
var threadEndEvent = new ManualResetEventSlim(false);
var executionThread = new Thread(async () =>
{
try
{
await T();
}
catch (Exception x)
{
//deal with exceptions...
}
finally
{
threadEndEvent.Set();
}
}
我的计时器超时运行:
timer.Elapsed += (sender, args) =>
{
var result = Task.Run(() => executionThread.Abort()).Wait(new TimeSpan(0, 0, 30);
//log if aborting was succesful and other info...
threadEndEvent.Set();
}
之后,我要这样做:
executionThread.Start();
threadEndEvent.Wait(timeoutSpan)
最终,发生以下两种情况之一:线程完成,或者在超时后尝试中止线程,记录发生的所有事件并继续前进。
这似乎在大多数情况下都可以正常工作,但是当我启动其他应用程序并崩溃时,显示标准错误,例如
” exe停止工作,Windows可以在线检查该问题的解决方案 问题”
流产永远不会发生,一切都挂断。
我以T方式启动该应用程序:
var process = new Process
{
StartInfo =
{
//Specify path to exe, arguments, etc...
}
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
我知道WaitForExit
是线程阻塞的,但是它是在单独的线程executionThread
中执行的,所以我不确定为什么执行会挂起。
我在这里想念什么?如何使它在超时后继续运行,无论发生什么情况?
答案 0 :(得分:-1)
最终找到了解决方案。不幸的是,调试器无法正常工作,因此细节会变得非常模糊。
开始深入研究后,我发现[17:32:01] Starting 'html'...
[Browsersync] 1 file changed (index.html)
[17:32:01] Finished 'html' after 6.28 ms
[Browsersync] Reloading Browsers...
[17:39:37] Starting 'css'...
[Browsersync] 1 file changed (styles.css)
[17:39:37] Finished 'css' after 30 ms
///
const gulp = require('gulp');
const postcss = require("gulp-postcss");
const autoprefixer = require("autoprefixer");
const cssvars = require("postcss-simple-vars");
const nested = require("postcss-nested");
const browsersync = require("browser-sync").create();
gulp.task('default', gulp.series (gulp.parallel(html,css,watchFiles,browserSync,browserSyncReload),
function (done) { done(); }
));
function css() {
return gulp
.src("./app/assets/styles/*.css")
.pipe(postcss([cssvars, nested, autoprefixer]))
.pipe(gulp.dest("./app/temp/styles"))
.pipe(browsersync.stream());
}
function html() {
return gulp
.src("./app/index.html")
.pipe(browsersync.stream());
}
function watchFiles() {
gulp.watch("./app/assets/styles/*.css", css);
gulp.watch("./app/index.html", html);
}
// BrowserSync
function browserSync(done) {
browsersync.init({
server: {
baseDir: "./app/"
},
port: 3000
});
done();
}
// BrowserSync Reload
function browserSyncReload(done) {
browsersync.reload();
done();
}
的工作方式如下:
T
不知道为什么会这样,我正在处理未记录的旧代码。
无论如何,一旦我删除了多余的线程代码,就可以正确捕获异常,并且不会挂断任何东西。
不确定为什么要完全创建额外的线程才能使异常无法捕获(当此代码在.NET Framework上运行时从未见过该问题),但是如果遇到类似的问题,这可能是一个解决方案。