C# 我不知道如何处理SocketException以满足我的需要 导言和有关资料:

C# 我不知道如何处理SocketException以满足我的需要 导言和有关资料:,c#,ftp,.net-3.5,windows-mobile-6.5,opennetcf,C#,Ftp,.net 3.5,Windows Mobile 6.5,Opennetcf,我是一个没有经验的C#开发者,继承了同事的项目,并负责修复某些bug 其中一项任务是在互联网连接不可用时将应用程序切换到脱机模式。我的同事曾经帮助他处理应用程序的FTP连接部分,这让我很难处理 问题在于“登录”表单。这是用户看到的第一件事,此表单会自动尝试连接到服务器。如果没有可用的连接,它只是处于空闲状态,显示消息“正在连接…” 问题: 我的任务是在连接不可用时切换到脱机模式 我为解决这个问题所做的努力: 为了进一步解释,我觉得最好为登录表单的onLoad事件提供代码: // class fi

我是一个没有经验的C#开发者,继承了同事的项目,并负责修复某些bug

其中一项任务是在互联网连接不可用时将应用程序切换到脱机模式。我的同事曾经帮助他处理应用程序的FTP连接部分,这让我很难处理

问题在于“登录”表单。这是用户看到的第一件事,此表单会自动尝试连接到服务器。如果没有可用的连接,它只是处于空闲状态,显示消息“正在连接…”

问题: 我的任务是在连接不可用时切换到脱机模式

我为解决这个问题所做的努力: 为了进一步解释,我觉得最好为登录表单的
onLoad
事件提供代码:

// class fields:
delegate void StringDelegate(string value);
private FTP m_ftp;

private void dlgLoading_Load(object sender, EventArgs e)
{
    m_ftp = new FTP(address);
    m_ftp.ResponseReceived += new
        FTPResponseHandler(m_ftp_ResponseReceived);
    // m_ftp_Connected processes files in a certain way
    m_ftp.Connected += new FTPConnectedHandler(m_ftp_Connected);
    m_ftp.BeginConnect(username, password);
    // sets label's text to inform the user it is connecting
    lblText.Text += "Connecting...   ";
}
通过代码调试,我发现另一个文件中抛出了一个异常
SocketException
,该文件似乎属于
OpenNETCF
库。它的名称是
FTP.cs
,函数
ConnectThread
在尝试连接时抛出它
ConnectThread
由上述代码中的
m_ftp.BeginConnect
调用

这是非常好的,因为我还没有调整模拟器,以有互联网连接

在JAVA中,函数可以引发异常

通过阅读C#书籍/教程,通过互联网和这里进行搜索,我发现用C#无法做到这一点

然而,通过进一步研究,我了解到在C#异常中,当不处理时会“冒泡”

我的结论是,这可能是基于线程的良好编程实践(如果无法处理异常,则“冒泡”异常)

因此,我决定将异常从库中的方法一直“冒泡”到登录表单中的代码。然后我可以捕捉到它,并从那里以脱机模式继续

我已从库/我的代码中的相关方法中删除了
try/catch
块,并将上述代码更改为:

// class fields:
delegate void StringDelegate(string value);
private FTP m_ftp;

private void dlgLoading_Load(object sender, EventArgs e)
{
    try
    {
        m_ftp = new FTP(address);
        m_ftp.ResponseReceived += new
            FTPResponseHandler(m_ftp_ResponseReceived);
        // m_ftp_Connected processes files in a certain way
        m_ftp.Connected += new FTPConnectedHandler(m_ftp_Connected);
        m_ftp.BeginConnect(username, password);
        // sets label's text to inform the user it is connecting
        lblText.Text += "Connecting...   ";
    }
    catch( Exception ex )
    {
        MessageBox.Show( ex.Message );
        // i thought of adding a check at this place
        // if exception is SocketException 
        // so I can launch "offline code" here
    }
}
我希望在那里捕获异常,但我的程序终止了。我不确定,但这让我觉得异常在任何地方都不会得到处理

问题:
  • 在这种情况下,如何正确地“冒泡”这种类型的异常
  • 我的方法有效吗(我提醒你我非常缺乏经验)?有比我的方法更好的解决方案吗
由于缺乏经验,如果我遗漏了重要信息,我深表歉意。请留下评论,我会尽快编辑我的帖子

异步风格的方法(例如BeginXxx)只能在回调/事件中报告错误,因为只有在调用返回后才会发生错误。处理回调中的错误。它将由EndXxx方法抛出

对于每个BeginXxx调用,必须有一个相应的EndXxx调用,通常在回调中进行


这是APM模式。

您可以有多个捕捉块。因此,请尝试{}catch(SocketException){//handle socket errors}catch(Exception){\\handle other errors}@zaf:我可能错了,但在联机搜索后,我发现
m_ftp.BeginConnect(用户名、密码)调用启动单独的线程。正是在这个线程中发生了异常。遗憾的是,按照指令修改代码并没有改变任何事情。似乎在删除
try/catch
块后,异常会在线程中冒泡,永远不会到达我的表单,从而终止应用程序。再说一次,我可能错了,我非常缺乏经验,但这是我的逻辑…很抱歉,我错过了开头部分。无论如何,我不熟悉您正在使用的库,但通常使用BeginXXX的.net异步方法有一个异步回调参数。在此回调中,您可以尝试捕获错误(&C)。尝试查看您正在使用的BeginConnect方法是否有重载。要“冒泡”UI线程的异常,您可以使用SynchronizationContext。@zaf:我不熟悉您正在使用的库,我也不熟悉,它是由我从中继承项目的同事使用的:)通常使用BeginXXX的.net异步方法有一个异步回调参数。在此回调中,您可以尝试捕获错误(&C)。尝试查看您正在使用的BeginConnect方法是否有重载。要将异常“冒泡”到UI线程,可以使用SynchronizationContext。现在有很多有用的信息需要处理,我会在网上搜索,看看会发生什么。谢谢你给我指出了正确的方向。谢谢你的回答,我非常感谢。由于对所有这些都是陌生的,在我正式接受您的答案之前,我可能需要时间来实施您的解决方案,所以请耐心等待。致以最良好的祝愿。如果您想要一个更简单的模型,请在库支持的情况下使用wait。这是目前为止结合UI运行异步工作最简单的方法。没有等待,不要使用异步IO。使用任务启动任务。运行完成所有工作的任务。不再需要事件或回调。