C# 异步 Ping : not work from a Threading. 定时器

标签 c# multithreading asynchronous timer ping

希望解释得当。我正在从事一个项目,每 X 分钟运行 6000 多个同步异步 ping。如果我尝试从 Windows 窗体上的按钮运行该组件,它就可以工作。但是,如果您从“Threading.Timer”开始,它就会出现问题。有时应用程序会卡住等待 ping 的答案,有时会在您访问不能为 null 的变量时抛出 NullReferenceException 异常。但是,如果从用户请求表单上的按钮执行,则工作正常。

我希望有人能帮助我。

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

最佳答案

乍一看,我会说您在类里面对 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");

关于C# 异步 Ping : not work from a Threading. 定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4656134/

相关文章:

c# - 在 mouse_click 事件中选择 DataGridView 中的行

c# - 确保 NHibernate SessionFactory 只创建一次

c# - 计算值在数组中出现的次数

ruby-on-rails - Rails 中的多线程 : Circular dependency detected while autoloading constant

c# - 使用多线程为递归类实例创建新对象

c# - Automapper 返回一个空集合,我想要一个 null

java - 没有 volatile 的双重检查锁定

c# - 寻找 OO 大师,在设计我的编程逻辑时需要一些帮助。没什么特别的,只是新的

C# 异步方法在 Activity 暂停时继续,导致 IllegalStateException : Can not perform this action after onSaveInstanceState

Angular2 - 无法读取嵌套调用中未定义的属性 'subscribe'