Как достичь эквивалента WNetAddConnection2 с таймаутом? - PullRequest
4 голосов
/ 17 февраля 2012

Следующий вызов 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");
        }
    }
}

1 Ответ

1 голос
/ 17 февраля 2012

В более ранних версиях Windows было невозможно завершить процесс, который застрял в одной из функций WNetAddConnection. Это было исправлено в Vista. По словам Ларри Остермана , исправлением является CancelSynchronousIo .

Решение вашей проблемы:

  1. Создать новый поток для запуска WNetAddConnection2
  2. Установить таймер или подождать в существующей теме.
  3. После тайм-аута вызвать CancelSynchronousIo, указав дескриптор потока соединения.

Я не могу придумать причину, по которой это плохо взаимодействует с .Net, но я на самом деле не пробовал ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...