2012-02-17 89 views
4

次のWNetAddConnection2の呼び出しは永遠に停止しているようです。マシン名は意図的に間違っていることに注意してください。永遠にブロックするのではなく、早急に失敗したいと思います。同様の機能を実現する方法はありますか?タイムアウトがありますか?どのようにWNetAddConnection2と同等のタイムアウトを達成するには?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [StructLayout(LayoutKind.Sequential)] 
     public class NETRESOURCE 
     { 
      public int dwScope; 
      public int dwType; 
      public int dwDisplayType; 
      public int dwUsage; 
      public string LocalName; 
      public string RemoteName; 
      public string Comment; 
      public string Provider; 
     } 
     [DllImport("mpr.dll")] 
     public static extern int WNetAddConnection2(NETRESOURCE netResource, string password, string username, int flags); 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      NETRESOURCE myResource = new NETRESOURCE(); 
      myResource.dwScope = 0; 
      myResource.dwType = 0; //RESOURCETYPE_ANY 
      myResource.dwDisplayType = 0; 
      myResource.LocalName = ""; 
      myResource.RemoteName = @"\\invalid.machine.com"; 
      myResource.dwUsage = 0; 
      myResource.Comment = ""; 
      myResource.Provider = ""; 

      int returnValue = WNetAddConnection2(myResource, "password", "username", 0); //hangs forever 
      Debug.Print("Finished connecting"); 
     } 
    } 
} 
+2

は永遠に長い時間です。あなたはどれくらい待ったのですか?最終的にタイムアウトするはずです。 –

+0

数分:私はむしろ、私のスレッドを数秒待つようにします。 – Jon

+0

スレッドに入れ、WaitHandle( 'ManualResetEvent'のような)をWaitOneでタイムアウトさせて設定してから、' Thread.Abort'を使ってスレッドを終了させます。 –

答えて

1

以前のバージョンのWindowsでは、WNetAddConnection関数の1つでスタックされたプロセスを終了できませんでした。これはVistaで修正されました。 According to Larry Ostermanの場合、修正はCancelSynchronousIo関数です。

あなたの問題を解決するには、次のとおりです。

  1. がでWNetAddConnection2
  2. は、タイマーを設定したり、既存のスレッドで待機実行する新しいスレッドを起動します。
  3. タイムアウト呼び出し後に、接続スレッドのハンドルを指定するCancelSynchronousIo。

私は、これは.NETとの相互作用をひどくする理由何らかの理由を考えることはできませんが、私は実際にそれを試していない...

+0

+1答えが「マネージスレッドのネイティブスレッドハンドルをどうやって取得するのですか?また、ネイティブスレッドがマネージスレッドと固定の関係にないときはどうしたらいいでしょうか? – Jon

+0

これは100%信頼できるものではありませんが、WNetAddConnection2を呼び出す直前にGetCurrentThreadIdにピンボケしてもかまいません(マネージスレッドは、2つの呼び出し間で別のネイティブスレッドで再スケジュールできます)。新しいスレッドにWNetAddConnectionを起動し、スレッドIDを返したアンマネージDLLを書き込むことができます。それは少し不器用ですが。 – arx

+0

これを試しましたが、スレッドがWNetAddConnection2でブロックされていても、ERROR_NOT_FOUNDを取得しました。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363794%28v=vs.85%29.aspxによると、「この関数がキャンセル要求を見つけることができない場合、戻り値は0 (ゼロ)、GetLastErrorはERROR_NOT_FOUNDを返します。 – Jon

関連する問題