平。SendAsync不打回电平Completedeventhandler
-
20-12-2019 - |
题
我在传递无效的IP-0.0.0.51时遇到了SendAsync方法的一些问题
问题是,回调方法(pingSender_PingCompleted)甚至没有被调用。我没有看到任何错误。
Ip地址。TypeParse发现此IP为"有效"IP。
这是我的代码;请让我知道我在这里看不到什么。
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Program c = new Program();
try
{
c.PingStore("0.0.0.51");
Console.WriteLine("Pinged without exceptions");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private void PingStore(string ipAddress)
{
Ping pingSender = new Ping();
pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_PingCompleted);
pingSender.SendAsync(ipAddress, null);
}
private void pingSender_PingCompleted(object sender, PingCompletedEventArgs e)
{
Console.WriteLine("PingCompleted invoked. continue to be happy");
}
}
}
请注意,我不能:
对ipAddress的内容有任何控制
使用正则表达式使我的代码复杂化
解决方案
我已经在一个简单的控制台应用程序中测试了你的两种方法,我得到了 PingException
为 0.0.0.51
正如 itsme86 评论道。
这是我对正在发生的事情的猜测:您的评论"我期待这种方法同时被称为100次。"加 pingSender_PingCompleted
没有被调用意味着你正在调用 PingStore
工作线程上的方法(例如使用 ThreadPool
).这就是为什么你不能抓住 PingException
在你的主线程上 pingSender_PingCompleted
从不因异常而被调用。
更新资料
在您的评论中,您写道:"仅供参考,我在.Net4.0上。".
您是否100%确定,您的应用程序的目标是v4.0,而不是v3.5或更早版本?
我能够使用您的确切代码重现您的问题,但是当针对.NET Framework v3.5时(对于v4.0,使用您的代码引发异常)。
我在系统中做了一些挖掘。两个框架版本的dll,这是我发现的:
- 两个框架版本都在
Ping
方法中的类private PingReply InternalSend(...)
使用native方法num = (int)UnsafeNetInfoNativeMethods.IcmpSendEcho2
. - 在错误的情况下
num
被设置为0
, ,并且我发现每个框架版本都以不同的方式处理这种情况。
框架v3.5/2.0:
if (num == 0)
{
num = Marshal.GetLastWin32Error();
if (num != 0)
{
this.FreeUnmanagedStructures();
return new PingReply((IPStatus)num);
}
}
Framewrk v4.0/4.5:
if (num == 0)
{
num = Marshal.GetLastWin32Error();
if (async && (long)num == 997L)
{
return null;
}
this.FreeUnmanagedStructures();
this.UnregisterWaitHandle();
if (async || num < 11002 || num > 11045)
{
/* NOTE! This throws the exception for 0.0.0.51 address that you're not getting */
throw new Win32Exception(num);
}
return new PingReply((IPStatus)num);
}
正如您在上面的代码片段中看到的,在.NET v4.0中,您应该能够捕获异常,而在.NET v3.5中,所有本机WIN32错误都以静默方式处理。
不隶属于 StackOverflow