限制例行程序可以运行 - VBNET

时间:2015-05-26 10:16:01

标签: vb.net timer

我正在尝试填充数据集,但我想将系统填充此数据集所需的时间限制为30秒。

我已经尝试过(正如SO上其他地方所建议的那样):

Dim T As Date = Date.Now
da.Fill(ds, "DATASET")
Do

    If (Date.Now - T).TotalSeconds >= 30 Then
        Main.VIEW_Title.Text = "Error In Connection..."
        Exit Sub
    End If
    Exit Do
Loop

但是系统只是在da.Fill(ds, "DATASET")部分中挂起,并且没有执行“错误连接”消息。如果我把这条线放在DO内也没关系,因为它停在那里。我需要的是它执行fill命令,然后如果它在30秒内没有完成,则允许我处理该错误。

由于

1 个答案:

答案 0 :(得分:0)

不幸的是,这并不容易。

可以做的是:

  • 启动后台线程并在该线程中执行填充操作。
  • 在主线程中,等待100ms,检查新线程是否完成,最多重复300次。

现在真正的问题是:如果主线程确定后台线程在30秒后完成,你会怎么做? DataAdapter.Fill没有提供优雅地中断操作的方法,所以你必须让它在后台继续。

这也意味着您必须在后台线程中使用单独的数据连接,因为ADO.NET类不是线程安全的。

我宁愿建议一种不同的方法:超过30秒的数据选择操作意味着:

  • 您选择了太多数据(实际上没有用户向用户显示100万行)或
  • 您的查询需要优化(例如放置良好的索引)。

因此,我建议修复根本原因,而不是使用复杂的解决方法来掩盖症状。