C#Async Ping:不能从Threading.Timer中工作

时间:2011-01-11 09:35:41

标签: c# multithreading asynchronous timer ping

我希望能够正确解释。我正在研究一个每X分钟运行超过6000个同步异步ping的项目。如果我尝试从Windows窗体上的按钮运行该组件,它的工作原理。但如果你从“Threading.Timer”开始,那就有问题了。有时应用程序会等待ping的答案,有时候当你访问一个我不能为null的变量时会抛出NullReferenceException异常。但是,如果从用户请求表单上的按钮执行工作正常。

我希望有人可以帮助我。

using System.Net.NetworkInformation;
using System.Threading;

3 个答案:

答案 0 :(得分:4)

第一次猜测我会说你在课堂上对GUI做了一些更新。由于按钮上的一切正常,因此您可以在GUI线程中运行任务,并且可以毫无问题地访问那里的所有内容。如果将任务外包到自己的线程中,则无法直接访问GUI。

要解决此问题,您可以将gui调用包装到(Begin)Invoke()调用中(可以找到有关这些命令差异的更深入的文章here)。为了使它更容易,您还可以使用以下扩展方法之一:

public static class ControlExtensions
{
    public static void InvokeIfRequired(this Control c, Action<Control> action)
    {
        if (c.InvokeRequired)
        {
            c.Invoke(new Action(() => action(c)));
        }
        else
        {
            action(c);
        }
    }

    public static void BeginInvokeIfRequired(this Control c, Action<Control> action)
    {
        if (c.InvokeRequired)
        {
            c.BeginInvoke(new Action(() => action(c)));
        }
        else
        {
            action(c);
        }
    }
}

用法是:

myTextBox.InvokeIfRequired((ctrl) => ctrl.Text == "SomeNewText");

答案 1 :(得分:0)

您是否尝试使用多个BackgroundWorker而不是Timer?

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

答案 2 :(得分:0)

感谢大家的帮助!我找到了解决方案(工作时间)。我所做的就是改变你破坏对象“ping”的方式来接收你的重播。现在使用参数“sender”(对ping的引用)在方法“PingResult”中销毁每个对象“ping”,如下所示:

((Ping)sender).PingCompleted -= PingResult;
((IDisposable)sender).Dispose();

这对我有用。我希望它能帮助别人。

致以诚挚的问候,非常感谢你们!