【问题标题】:Invoking Delegate in a Console Application在控制台应用程序中调用委托
【发布时间】:2011-08-10 13:50:29
【问题描述】:

我需要将 WinForm 应用程序迁移到控制台应用程序。

在 WinForm 应用程序中,我有类似的内容:

this.Invoke(new LogResponseCallback(this.LogResponse), new object[] { allAlarmsJson });


   private delegate void LogResponseCallback(string text);
    private void LogResponse(string response)
    {
        this._richTextResponse.Text = response + "\r\n";
    }

好像在处理完某个操作后调用了主线程。

我关心的是如何在控制台应用程序中实现相同的异步委托调用。

任何帮助将不胜感激。

提前致谢

【问题讨论】:

  • 你不能,控制台应用程序没有必要的管道来使 SynchronizationContext 派生类工作。制作你自己的基本上涉及重新发明消息循环。这在控制台应用程序中的问题要小得多,因为 Console 类已经是线程安全的。避免在控制台应用程序中使用 RichTextBox,当您操作其 Rtf 属性时,它往往会创建其窗口句柄。这不好。

标签: winforms asynchronous delegates console-application


【解决方案1】:

这是我问的一个问题,关于 Invoke 是如何完成它的工作的,

Curious about the implementation of Control.Invoke()

【讨论】:

    【解决方案2】:

    通常在 Windows 窗体中,您会使用 Control.Invoke 从后台线程返回 UI 线程,因为您无法在非 UI 线程中访问 UI 控件。

    同样的限制不适用于控制台应用程序 - 您可能仍然需要小心避免线程问题,但它们不太可能是相同的问题。如果您所做的只是登录到控制台(例如使用Console.WriteLine),您应该可以只在后台线程中进行登录。

    【讨论】:

    • 感谢大家的帮助。我没有什么顾虑:这是否意味着我可以直接在我的控制台应用程序中调用该方法(因为这里是 LogResponse)。此外,在 Windows 应用程序中基本上完成的是它发送 Http 请求并连续接收响应。我怎样才能做到这一点?
    • @user739990:LogResponse 方法似乎正在使用 UI 控件...大概您不会再这样做了,那么您将要做什么。不清楚您所说的“连续接收响应”是什么意思 - 您是否需要多个并发请求,或者您只是乐于循环、获取数据并记录它?
    • WinForm 应用程序中通过 Control.Invoke() 调用了许多方法来回答您的第二个问题。代码使用 this._timer = new System.Threading.Timer(new TimerCallback(GetRealtimeUpdates ), null, -1, -1);
    • private string GetRealtimeUpdates (string requestUrl) { // 锁定一个对象以确保来自不同线程的请求/响应不会踩到自己 lock (this._cookieContainer) { // 准备请求 webRequest = ( HttpWebRequest)WebRequest.Create(requestUrl); webResponse = (HttpWebResponse)webRequest.GetResponse(); } this.Invoke(new LogResponseCallback(this.LogResponse), new object[] { allChannels}); }
    • 好像有线程调用。数据来自 HTTP 请求,在应用程序 GUI 中,网格每隔几秒钟就会不断填充数据。
    【解决方案3】:

    首先,您没有在代码中使用任何异步委托,this.Invoke 是同步调用。
    其次,如果您正在运行控制台应用程序,则不必将调用编组回主线程,您只应该在执行依赖线程的代码时这样做,例如 winforms、wpf UI 线程和一些 COM 组件,您只需要在这些情况下编组调用,因为这些组件依赖于创建它们的线程

    【讨论】:

    • 这是否意味着我可以直接在我的控制台应用程序中调用该方法(因为这里是 LogResponse)。此外,在 Windows 应用程序中基本上完成的是它发送 Http 请求并连续接收响应。我怎样才能做到这一点?
    • 我不知道您的_richTextResponse winform UI 控件和您的控制台应用程序之间的关系是什么?如果你想运行控制台应用程序,那么你不需要使用_richTextResponse 登录,因为它是一个 Windows 窗体 UI 控件,它与控制台应用程序无关。但是你想在这里实现什么?如果您正在运行 Windows 窗体应用程序,您可以从它启动控制台应用程序。查看this link 了解如何操作。
    • 正如我之前提到的,我需要将 WinForm 应用程序迁移到基于控制台的应用程序。这个 Winform 应用程序的工作是发送 Https 请求并获得响应。这是 RealTime,已通过 code this._timer = new System.Threading.Timer(new TimerCallback(GetRealtimeUpdates), null, -1, -1); code
    • 除此之外,WinForm 应用程序内还有使用“代码”this.Invoke(new LogResponseCallback(this.LogResponse) 的委托调用。我知道这是为了在 UI 线程中调用它。所以,应该我通过简单地调用(那些代表的)方法来替换控制台应用程序中的此类调用?
    猜你喜欢
    • 2011-04-09
    • 2015-08-22
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多