2012-02-17 3 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 기능 중 하나에서 멈춘 프로세스를 종료 할 수 없었습니다. 이것은 Vista에서 수정되었습니다. According to Larry Osterman이면 수정은 CancelSynchronousIo 함수입니다.

문제에 대한 해결책은 다음과 같습니다

  1. 이 WNetAddConnection2
  2. 가 타이머를 설정하거나 기존 스레드에서 대기 실행하는 새 스레드를 시작합니다.
  3. 제한 시간 호출 후 연결 스레드의 핸들을 지정하는 CancelSynchronousIo.

나는 이것이 닷넷과의 상호 작용이 나쁜 왜 어떤 이유로 생각할 수 없다, 그러나 나는 실제로 그것을 시도하지 않은 ...

+0

+1 대답에 대해 "관리되는 스레드의 네이티브 스레드 핸들을 어떻게 얻습니까? 또한 네이티브 스레드가 관리되는 스레드와 고정 된 관계가없는 경우에도 수행해야합니까?"라는 질문이 제기됩니다. – Jon

+0

WNetAddConnection2를 호출하기 직전에 GetCurrentThreadId를 pinvoke 할 수 있습니다.이 경우 100 % 신뢰할 수는 없습니다 (관리되는 스레드가 두 호출 사이의 다른 원시 스레드에서 다시 스케줄 될 수 있음). 새 스레드에서 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

관련 문제