C# MessageBox.Show是否会导致服务器端的超时问题?

C# MessageBox.Show是否会导致服务器端的超时问题?,c#,sql-server,ssis,try-catch,job-scheduling,C#,Sql Server,Ssis,Try Catch,Job Scheduling,我在服务器上的SQL Server Agent中有一个带有脚本任务的计划SSIS包。我确实为SQL连接设置了timeout,对于Try块中的一些代码,它会抛出错误,并且MessageBox.Show在Catch块中。如果我保持代码不变,作业将失败,但是如果我注释掉那些MessageBox.Show,并将Catch块留空以进行测试,作业将成功运行 任何人都知道,MessageBox.Show会影响服务器端连接的超时,或者在禁用显示错误消息后,究竟是什么原因导致这种不同的结果 提前感谢:)Messa

我在服务器上的
SQL Server Agent
中有一个带有
脚本任务的计划SSIS包。我确实为SQL连接设置了
timeout
,对于
Try
块中的一些代码,它会抛出错误,并且
MessageBox.Show
Catch
块中。如果我保持代码不变,作业将失败,但是如果我注释掉那些
MessageBox.Show
,并将
Catch
块留空以进行测试,作业将成功运行

任何人都知道,
MessageBox.Show
会影响服务器端连接的
超时
,或者在禁用显示错误消息后,究竟是什么原因导致这种不同的结果


提前感谢:)

Messagebox。如果在visual studio ssdt之外执行,show
将引发异常。当您删除它时,catch块是空的,因此您的脚本将忽略异常(空catch块=无错误处理,仅忽略)

如果删除了
,请尝试。。catch
block将触发异常并显示一条消息


超时可能是由Messagebox引发的异常引起的。在DTS中,您可以创建UI交互,从而导致包无限期地等待按钮单击继续

SSIS试图通过确定此问题是否在“”中运行来解决此问题。这与Hadi的答案类似,但不同之处在于,在BIDS/SSDT/Visual Studio之外单独运行SSIS包不足以触发取消设置交互模式标志

尝试从以非交互模式运行的SSIS包与UI交互将导致代码引发异常

如果将消息框添加到脚本任务中,我发现一种有用的模式是将System::InteractiveMode变量作为只读变量添加到任务中,然后使用以下命令

bool interactiveMode = (bool) Dts.Variables["System::InteractiveMode"].Value;
if (interactiveMode)
{
    // UI code here
    MessageBox.Show("Something happened");
}
我发现上面的内容更简洁,因为相同的代码可以部署到生产环境中,也可以在我的桌面上运行,而不是“一切正常,在我更改以删除调试垫片时只需一秒钟”。。。并修复一些本可以做得更好的代码

最后一点,我还发现使用UI元素的形式很糟糕,因为我很懒,不想截屏或写下他们说的话。相反,请使用包中的
Dts.Events.fireformation
事件。例如,此通用代码将枚举所有变量(我已检查为只读或读写)及其值

    public void Main()
    {
        bool fireAgain = false;
        string message = "{0}::{1} : {2}";
        foreach (var item in Dts.Variables)
        {
            Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain);
        }

        Dts.TaskResult = (int)ScriptResults.Success;
    }

现在,当我运行包时,VisualStudio中的“输出”选项卡(我可以在其中全部选择)+“图形结果”选项卡将包含所有这些信息消息。当我运行包时,如果我在包部署模型中使用2005/2008或2012+,我需要确保我有
/rep eiw
参数来捕获作业日志或控制台中的错误、信息和警告事件或其他内容(默认情况下仅报告错误)。2012+with project deployment model将自动将信息捕获到SSISDB.catalog.operation_messages表中。

我知道这是旧的,但以防万一,它可以帮助其他人解决我遇到的相同问题

我的包始终在SSDT中工作,并在错误情况下提供有用的日志消息。然而,当它在生产中失败时,我得到的只是一条模棱两可的
“异常已被调用的目标抛出。”
消息,没有任何记录


结果是,在调用Dts.Log之前,我愚蠢地在catch块中添加了一个
MessageBox.Show
。我通过实现上述billinkc的“交互模式”解决了这个问题。

不清楚,但如果显示消息框,我会假设执行将暂停,直到消息框关闭?!我不认为MessageBox.Show会减慢速度并导致服务器超时。你可以发布你的代码样本,这样我们就可以得到一点清晰。此外,我建议您背靠背重复几次测试,以排除巧合的可能性:)或MessageBox将脚本挂起,直到达到超时限制为止?@Tanner,服务器上的MessageBox如何关闭,批处理脚本中是否有类似于
continue
的命令?@LONG我不明白您为什么要使用Messagebox,为什么不在某个地方静默记录它?Thx Hadi,或者我可以理解
Messagebox.Show
将暂停任务,直到任务达到超时,然后抛出错误?我认为是这样的。但是
Messagebox.show()
抛出的例外是SSI不能显示图形组件。不是真的