C# 我不知道如何处理SocketException以满足我的需要 导言和有关资料:
我是一个没有经验的C#开发者,继承了同事的项目,并负责修复某些bug 其中一项任务是在互联网连接不可用时将应用程序切换到脱机模式。我的同事曾经帮助他处理应用程序的FTP连接部分,这让我很难处理 问题在于“登录”表单。这是用户看到的第一件事,此表单会自动尝试连接到服务器。如果没有可用的连接,它只是处于空闲状态,显示消息“正在连接…” 问题: 我的任务是在连接不可用时切换到脱机模式 我为解决这个问题所做的努力: 为了进一步解释,我觉得最好为登录表单的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
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
}
}
我希望在那里捕获异常,但我的程序终止了。我不确定,但这让我觉得异常在任何地方都不会得到处理
问题:
- 在这种情况下,如何正确地“冒泡”这种类型的异常
- 我的方法有效吗(我提醒你我非常缺乏经验)?有比我的方法更好的解决方案吗
这是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。使用任务启动任务。运行完成所有工作的任务。不再需要事件或回调。