退出后嵌入式服务器应用程序已停止工作

威士忌

我有一个在Firebird数据库中存储一些数据的应用程序。我正在使用嵌入式firebird服务器和EntityFramework,并且都可以很好地工作,但是当我通过窗体上的x按钮关闭我的应用程序时,出现了Windows系统消息“应用程序已停止工作”,并且我无法捕获此异常。我的应用程序中有一个UnhandledExceptionHandler:

// Add handler for UI thread exceptions
Application.ThreadException += new ThreadExceptionEventHandler(UIThreadException);

// Force all WinForms errors to go through handler
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

//This handler is for catching non-UI thread exceptions 
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

.....some other code..........

Application.Run(new MainForm());

但是这种异常永远不会被它捕获。所以我去了Windows事件日志,并在其中找到error-event的xml视图:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Application Error" /> 
  <EventID Qualifiers="0">1000</EventID> 
  <Level>2</Level> 
  <Task>100</Task> 
  <Keywords>0x80000000000000</Keywords> 
  <TimeCreated SystemTime="2017-03-14T23:06:25.000000000Z" /> 
  <EventRecordID>36077</EventRecordID> 
  <Channel>Application</Channel> 
  <Computer>MYPC</Computer> 
  <Security /> 
  </System>
- <EventData>
  <Data>MyApp.exe</Data> 
  <Data>1.0.0.0</Data> 
  <Data>58c7a3f0</Data> 
  <Data>fbintl.DLL</Data> 
  <Data>2.5.5.26952</Data> 
  <Data>5644432f</Data> 
  <Data>c0000005</Data> 
  <Data>00004e9c</Data> 
  <Data>1d64</Data> 
  <Data>01d29d1797fb7f0d</Data> 
  <Data>G:\Programming\WorkSpace\C#\MyApp\bin\x86\Debug\MyApp.exe</Data>
  <Data>G:\Programming\WorkSpace\C#\MyApp\bin\x86\Debug\FireBirdEmbeddedServer\intl\fbintl.DLL</Data> 
 <Data>d84a6ca6-090a-11e7-8151-005056c00008</Data> 
 </EventData>
 </Event>

如您所见,当应用程序已经关闭时,fbintl.DLL出了点问题。那么,如何获得有关此问题的更详细描述?

UPD我使应用程序更短一些,以检测到我的问题的原因-现在,只有此EF代码在应用程序关闭之前运行

 public async Task GetAutoAnswerTemplate()
    {           
       try
        {
          using (var db = new FirebirdDbContext(embeddedConnectionString)){
            //Async or sync methods doesn't affect to my problem
             AutoAnswerTemplate template = await dbContext.AutoAnswerTemplate.FirstOrDefaultAsync();
            return template?.AutoAnswer_body;
          }
        }
        catch (Exception ex)
        {
            throw new EmbeddedFbDataBaseTools.EmbeddedDbException(
                "Error while getting auto answer template" + "\r\n" +  ex.Message, ex);
        }
    }

其中FirebirdDbContext是:

public class FirebirdDbContext : DbContext
{

    public FirebirdDbContext(string connString)
        : base(new FbConnection(connString), true)
    {
        //* The Entity initializer is bugged with Firebird embedded: http://stackoverflow.com/q/20959450/2504010  so I didn't use default--->
        //  Database.SetInitializer<FirebirdDBContext>(new CreateDatabaseIfNotExists<FirebirdDBContext>());    
        Database.SetInitializer<FirebirdDbContext>(new MyCreateDatabaseIfNotExists());
    }

    public DbSet<AutoAnswerTemplate> AutoAnswerTemplate { get; set; }
    public DbSet<User> User { get; set; }


}

class MyCreateDatabaseIfNotExists : IDatabaseInitializer<FirebirdDbContext>
{
    public void InitializeDatabase(FirebirdDbContext context)
    {
        if (!context.Database.Exists())
        {
            context.Database.Create();
        }
    }
}

和连接参数是

  public static string GetEmbeddeddefaultConnectionString()
    {
        FbConnectionStringBuilder builder = new FbConnectionStringBuilder
        {
            ServerType = FbServerType.Embedded,
            DataSource = "localhost",
            Port = 3050,
            Database = EmbeddedDbPath, //Path to embedded db
            ClientLibrary = EmbeddedServerDllPath,
            UserID = "SYSDBA",
            Password = "masterkey",
            Charset = "WIN1251",
            Dialect = 3,
            ConnectionLifeTime = 15,
            Pooling = true,
            MinPoolSize = 0,
            MaxPoolSize = 50
        };
        return builder.ToString();
    }

新更新25.04.2017

我制作了一个带有firebird嵌入式数据库的简单应用程序,以演示该错误。你可以在这里找到

该应用程序创建了一个firebird嵌入式数据库,并在后台线程(任务TPL)中连接到该数据库,并且在工作完成之后(_bgTask.Status == TaskStatus.RanToCompletion),请关闭该应用程序并获取错误。

stakx-不再贡献

在连接字符串中,已指定字符集并启用了连接池:

FbConnectionStringBuilder builder = new FbConnectionStringBuilder
{
    …
    Charset = "WIN1251",
    …
    Pooling = true,
    …
};

这两个设置的组合似乎触发了错误。不是在您自己的代码中,而是在FirebirdSQL中。到目前为止,我已经找到了解决此问题的三种方法。您可以执行以下任一操作:

  1. FbConnection.ClearAllPools()在应用程序终止之前立即调用静态方法(并使连接池保持启用状态):

    private static void AppExit(object sender, EventArgs e)
    {
        …
        FbConnection.ClearAllPools();
    }
    
  2. 通过设置禁用连接池Pooling = false

  3. 由于该错误是在中触发的fbintl.dll,它似乎是在处理字符集/国际化,因此您可以简单地省略Charset连接字符串参数(尽管我不知道这样做会带来什么后果)。

最后两个建议是解决方法。我可能会选择选项#1,因为它看起来最干净,它允许您保持连接池处于启用状态(这通常是一件好事),并指定所需的字符集。

还请注意,只有在连接了调试器的情况下运行应用程序,您才可能看到异常。在生产中,异常可能会保持沉默,并且完全不会被注意到。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当部署到Tomcat但随着嵌入式服务器的工作原理春季启动应用程序提供了404

Swing应用程序中嵌入式HTTP服务器的Java类

在Linux的嵌入式Tomcat服务器中运行Spring Boot应用程序

无法使用嵌入式iPython Qtconsole退出PyQt5应用程序

csc.exe已停止工作,导致“ /”应用程序中的服务器错误

在门户网站上启用应用程序见解扩展后,应用程序服务停止工作

WebRTC服务器停止工作

Channels应用程序无故停止工作,并且没有重新启动ASGI服务器

节点服务器多次工作后停止工作

Android Studio:从Google Studio打开应用程序后,该应用程序停止工作

在Docker上使用嵌入式Jetty服务器运行Java应用程序

将aiohttp服务器嵌入PyQt应用程序

容器化后,NodeJS应用程序停止工作[容器中的FTP服务器]

使用`System.exit()`停止具有嵌入式Jetty服务器的Java应用程序是否安全?

应用程序已停止工作

不幸的是,应用程序已停止工作?

Windows应用商店应用程序嵌入式ScrollViewer无法正常工作

嵌入式Jetty服务器

提交我的应用程序后,iAds已停止工作

VsHub服务器已停止工作

Hashcat或AMD驱动程序在无头Debian服务器上短暂运行后停止工作

应用程序更新后,小部件接收器停止工作

每当我在模拟器上运行该应用程序时,它都会说不幸的是,该应用程序已停止工作,日志显示如下

嵌入式Java Web服务器隐藏应用程序界面

服务器退出后,Play框架应用停止运行

单击按钮后应用程序停止工作

Skype For Business Online UCWA 应用程序服务器在一段时间后停止工作

单击按钮后应用程序停止工作

请求参数被记录在带有 Spring Boot 应用程序的嵌入式码头服务器的访问日志中