2009-05-25 5 views
1

現在、私のようなものを持っています。しかし、最近の再訪問の後に私は質問があります。この特定のケースでは、OnResponse()関数はUIを更新しないため、ここで目的を果たさないようです。私はそれを取り除いただけでなく、以前と同じように動作します。何か不足していますか?OpenNetCF FTPクラスマルチスレッディング質問

フォームを使用したマルチスレッドの詳細については、上記のコードで説明したこのメカニズムがUIの応答性を確認するためのものであることを理解しました。

:この機能は以下のように実装されている

delegate void StringDelegate(string dummy); 
void OnResponse(string dummy) 
{ 
    if(!InvokeRequired) 
    { 
     button1.Text = dummy; 
    } 
    else 
     Invoke(new StringDelegate(OnResponse),new object[] {enabled}); 
} 

場合:私たちが言う必要があるとき

だから場合には、次のように我々が実装さOnResponseだろう(例えばなどテキストボックス、ラベルなど)のUI要素を更新します

delegate void StringDelegate(string dummy); 
    void OnResponse(string dummy) 
    { 
     if(InvokeRequired) 
     {    
      Invoke(new StringDelegate(OnResponse),new object[] {dummy}); 
      return; 
     } 
    } 

これを使用するにはどうすればよいですか?それは絶対に必要ですか?

もう1つの質問:ftpオブジェクトはここで独自のスレッドで実行されていますか?

答えて

1

FTPオブジェクトは、独自のスレッドで実行されています。どのように私は知っていますか?この行:

m_ftp.BeginConnect(user.Text, password.Text); 

これは非同期方式です。これを呼び出すと、FTPコンポーネントは.NETスレッドプールからのスレッドを使用してすべての作業を行います。この専用のスレッドは、イベントを「発生させる」ために使用されます。最終的に「発生したイベント」は、イベント呼び出しリストに追加されたすべてのデリゲートへの1つ以上のメソッド呼び出しです。これらのメソッドを呼び出すBeginメソッドによってスピンアップされるのは、この専用のスレッドです。このスレッドは、UIを実行するスレッドと同じスレッドではないため、Invoke呼び出しが必要です。

FTPコンポーネントでUIスレッドを使用する場合は、BeginConnectメソッドの代わりにConnectメソッドを使用します。つまり、あなたのイベントはどちらも動かず、インタラクションにもUIは反応しません。これは、スレッドが一度に1つのことしか実行できないためです。UIを処理しているか、FTPコードを実行しているからです。このため、2番目のスレッドが必要です。

意味がありますか?

-Oyin

+0

ありがとう!ソルはそうです。現在のコードは、m_ftp_ResponseReceived()内のUIを更新することができます...それが私が混乱している理由です。私の理解は、FTPオブジェクトが独自のスレッドで実行されていましたが、Invokeを使用していない限り、m_ftp_ResponseReceived()内のUIを更新できないはずです。何がありますか?私はUIを応答させるために、BeginConnect()を使い続けたいと思っています。 – sarsnake

+0

また、OpenNetCFにはFTPクラスのConnectメソッドがありません。ちょうどBeginConnect() – sarsnake

+0

私はそれをもっとテストしました。そして、私はm_ftp_ResponseReceived()からUIを更新できるようです。 m_ftp_Connected()内からそれを行うことはできません。非常に興味深い観察。 UIスレッドでm_ftp_Connectedが実行されている必要があります。 – sarsnake