C# 使用BackgroundWorker的SQL同步问题

C# 使用BackgroundWorker的SQL同步问题,c#,sql,sql-server,multithreading,backgroundworker,C#,Sql,Sql Server,Multithreading,Backgroundworker,我有一段代码在C#中运行,使用backgroundworker与SQL server(在VM中)通信 前 在CreateSQLTable函数中,我只有创建SQL表和发送SQL命令,而没有返回任何返回值,超时设置的时间更长,比如120秒,确保SQL服务器完全运行该命令。在RunWorkerComplete中,我使用RunworkerAsync来循环此任务 问题: 从CreateSQLTable()在数据库中不断创建重复表,奇怪的是,它假设只创建一个,但在我的数据库中不断显示更多,甚至我有下面的de

我有一段代码在C#中运行,使用backgroundworker与SQL server(在VM中)通信

在CreateSQLTable函数中,我只有创建SQL表和发送SQL命令,而没有返回任何返回值,超时设置的时间更长,比如120秒,确保SQL服务器完全运行该命令。在RunWorkerComplete中,我使用RunworkerAsync来循环此任务

问题:

  • 从CreateSQLTable()在数据库中不断创建重复表,奇怪的是,它假设只创建一个,但在我的数据库中不断显示更多,甚至我有下面的delete函数
  • 2.这是删除导致应用程序崩溃的表时找不到对象的关键异常。我的最佳猜测是,当删除表时,它无法找到以前创建的表

    根据我的理解,虽然调用backgroundworker应该是异步的,但是backgroundworker内部运行的内容是同步的。所以这样的问题不应该出现

    另一个子问题可能是问题的原因是,在SQL数据库部分,是否需要在超时值内运行命令?一旦达到超时值,它可能会被中断?还是因为后台工作程序和UI是在不同的类中编写的(由于MVC)


    有多线程经验的人能给我解释一下吗?非常感谢:)

    120秒对于一个简单的
    CREATE TABLE
    语句来说,听起来像是一个巨大的代码设计/系统架构问题。我怀疑您的问题与工作人员有关,请尝试(每个示例)单击按钮中的代码,并检查它是否具有相同的行为(并调试真正的问题)。如果与SQL无关的任何
    //xxx方法发生异常,则根据异常处理逻辑,您可能会提前退出该方法,并且该表可能不会被删除。您可能希望在
    finally
    语句中删除表(如果存在)的位置实现
    try-catch-finally
    。@ElementalPete-try-and-catch已应用于整个操作。@Gusman它在本地计算机中运行良好,但在VM中运行将出现上述问题:(通过单击按钮触发)
    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        CreateSQLTable();
    
        // xxx methods not related to SQL
    
        DeleteSQLTable();
    }
    
    private void backgroundWorker_RunWorkerCompleted(object sender, DoWorkEventArgs e)
    {
        backgroundWorker.RunWorkerAsync();
    }