C# 网络可用性更改套接字错误
我对创建以平板电脑为目标的应用程序还不熟悉。我有一个项目,在这个项目中,平板电脑可能在任何给定点都没有网络连接。我想监控网络可用性状态,并相应地启用/禁用UI上的功能。我读了一些书,发现了 使用System.Net.NetworkInformation。从我读到的内容来看,它似乎是我想要使用的,所以我根据我读到的文章/帖子添加了它 我使用Visual Studio 2013在.NET 4.0上运行64位Win7 Enterprise SP1。我正在运行的机器是Intel i3-2120。网络适配器是Intel 82579LMC# 网络可用性更改套接字错误,c#,windows,sockets,networking,tablet,C#,Windows,Sockets,Networking,Tablet,我对创建以平板电脑为目标的应用程序还不熟悉。我有一个项目,在这个项目中,平板电脑可能在任何给定点都没有网络连接。我想监控网络可用性状态,并相应地启用/禁用UI上的功能。我读了一些书,发现了 使用System.Net.NetworkInformation。从我读到的内容来看,它似乎是我想要使用的,所以我根据我读到的文章/帖子添加了它 我使用Visual Studio 2013在.NET 4.0上运行64位Win7 Enterprise SP1。我正在运行的机器是Intel i3-2120。网络适配
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.SQLite;
using System.Net.NetworkInformation;
using System.Collections.ObjectModel;
using System.Windows.Media.Effects;
using System.ComponentModel;
namespace GWL{
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
this.Loaded += delegate { MainWindowLoaded(); };
}
private void MainWindowLoaded()
{
NetworkIsAvailable = NetworkInterface.GetIsNetworkAvailable();
try
{
NetworkChange.NetworkAvailabilityChanged += delegate { NetworkIsAvailable = NetworkInterface.GetIsNetworkAvailable(); };
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
当处理转到NetworkChange.NetworkAvailabilityChanged侦听器时,我得到以下套接字错误:
System.Net.Sockets.SocketException Error Code 10022: "An invalid argument was supplied" at System.Net.SafeCloseSocketAndEvent.CreateWSASocketWithEvent(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType, Boolean autoReset, Boolean signaled) in System.
完整错误消息:
System.Net.Sockets.SocketException occurred
_HResult=-2147467259
_message=An invalid argument was supplied
HResult=-2147467259
IsTransient=false
Message=An invalid argument was supplied
Source=System
ErrorCode=10022
NativeErrorCode=10022
StackTrace:
at System.Net.SafeCloseSocketAndEvent.CreateWSASocketWithEvent(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType, Boolean autoReset, Boolean signaled)
InnerException:
在将委托分配给NetworkAvailabilityChanged或其他配置时,我是否遗漏了什么?感谢您的帮助。提前谢谢
更新:此问题似乎与project位于网络驱动器上的事实有关。我将其移动到本地存储,并且没有发生错误。当移回网络驱动器时,它会再次显示 您是说在语句
NetworkChange.NetworkAvailabilityChanged+=delegate{NetworkIsAvailable=NetworkInterface.GetIsNetworkAvailable();}中出现了该异常代码>?我不认为订阅事件会引发异常(在非常不寻常的情况下,OutOfMemoryException
可能除外)。您在什么环境下运行?Windows 8.1?Windows RT?什么版本的.NET?听起来你不是在处理.NET中的bug,就是在处理环境中的“按设计”限制。但如果没有更多细节,很难说。我正在Visual Studio 2015中使用.NET 4.0开发Win7。订阅事件时出错。我当前的实现是使用委托。我也尝试使用NetworkedAvailabilityChangedEventHandler,但得到了相同的结果。这对我来说不是一条关键路径,但它会让我的界面看起来未完成,我不能这样做。如果我能提供更多的信息,请告诉我。我可以毫无问题地重现错误。事件处理程序上方对GetIsNetworkAvailable()的调用工作正常。即使没有该调用,事件处理程序仍然会产生错误。我原以为在GetIsNetworkAvailable()之后可能会有某些内容被保留为打开状态,但事实似乎并非如此。完整堆栈跟踪是什么?并不是说GUI框架应该有所不同,而是您在这里使用的是哪一个?看起来像Winforms…你能确认吗?A会有帮助的,也许不会。但这确实是个好消息,因为这意味着你有一个失败的模型和一个有效的模型。比较两者最终会发现问题所在。只要开始从失败的产品中取出东西,直到它成功为止。:)顺便问一下,这真的是整个堆栈跟踪吗?只有一个堆栈帧的堆栈跟踪是极不寻常的。