当单独线程中的应用程序崩溃时,无法继续执行代码

时间:2018-12-23 13:24:26

标签: c# process .net-core

我要处理的是其他一些非常不稳定且非常容易崩溃的应用程序。

这是我当前的设置,执行本身发生在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中执行的,所以我不确定为什么执行会挂起。

我在这里想念什么?如何使它在超时后继续运行,无论发生什么情况?

1 个答案:

答案 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上运行时从未见过该问题),但是如果遇到类似的问题,这可能是一个解决方案。

相关问题