簡體   English   中英

在類而不是Windows窗體中使用OpenNETCF.Net.Ftp

[英]Using OpenNETCF.Net.Ftp inside a class instead of inside a Windows Form

到目前為止,我正在Windows窗體內使用FTP對象。 FTP對象在單獨的線程中運行,因此為了確保我的應用程序不會凍結,我使用以下代碼:

private void OnResponse(string response)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new StringDelegate(OnResponse), new object[] { response });
            return;
        }
    } //end of OnResponse

我不清楚什么是字符串委托,但是可以。

但是,我現在正在重構,希望將ftp隱藏到一個類中。 我的問題是如何確保主線程不會凍結? 在線上有關引發類內部事件的所有參考都是有意義的,但我還沒有找到一個應用程序是多線程的示例。 我最大的擔心是InvokeRequired。

在上面的代碼中,這是一種形式。 如果我將ftp對象隱藏在如下類中:

abstract class MyClass
{
    //data members
    private FTP _ftp;

    //other data members, methods, and properties etc
}

“這”成為MyClass的對象。 我不確定是否在類上實現了InvokeRequired屬性(也許我應該使其實現具有該屬性的特殊接口?)。 或者,也許我缺少某些東西,並且我不應該在類內部使用多線程對象?

您需要一個Control或從UI線程上創建的,衍生自Control的東西(不必是Form)。 您的MyClass可能不應該直接更新UI,因此在這里並不重要-MyClass可能會引發事件或調用回調。

當您想根據來自FTP庫的事件在Form上進行某些更改時,最重要的是UI。 為此,您需要一個Control或從Control派生的任何東西(同樣,也不必是一個Form),它是在UI線程上創建的。 使用該控件檢查InvokeRequired,如果為true,則調用Invoke。 原始版本使用自定義委托(可能對我很熟悉,可能來自FTP示例),但是您可以使用所需的任何委托。

Web上有很多使用Control.Invoke的示例,因此您應該可以輕松實現它。

設計此方法最可能的方法是讓“ MyClass”的調用者根據需要調用或不調用。 我會設計您的班級,以在響應發生時觸發事件。

請記住,只有與Windows UI交互的代碼需要被調用到主線程上。 OnResponse中的任何其他處理都可以在后台線程中完成,沒有問題。

如果您的“ MyClass”不是窗體或控件之類的Windows對象,那么您就不會像您所說的那樣具有InvokeRequired。 但這並不需要InvokeRequired。 如果其他代表UI對象的類確實需要對FTP對象做出響應,那么該UI對象可以執行InvokeRequired測試。

我希望這很清楚!


編輯:addl信息

OnReceived處理程序一定會在您的FTP類中。 所以我在想這樣的事情:

公共類MyFTPClass {公共事件EventHandler DataReceived; // UI表單可以訂閱此事件

 private void OnReceived()
 {
   //so the FTP has returned data
   // Do stuff here that can be on the background thread like saving
   // the file in an appropriate place, or whatever.


   // now trigger the DataReceived event.  Anyone who cares about data being received
   // can subscribe to this and do whatever is appropriate.
   if (DataReceived) DataReceived(this, EventArgs.Empty); 

}

這是一個粗略的輪廓。 但是基本的想法是,您可以在后台線程中本地進行操作。 然后,您可以通過事件通知UI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM