AsyncCallback на веб-странице .net убегает

Я некоторое время работал над небольшим проектом, и я думаю, что я близок, но у него есть «проблемы». Идея состоит в том, чтобы передать файл по FTP третьей стороне, они обрабатывают его и через 5-10 минут генерируют набор результатов, который необходимо загрузить и обработать на нашей стороне.

Так что код может быть немного простым, это просто то, что я собрал вместе

            if (!Page.IsPostBack)
            {
                string baseLocation = "C:\\temp\\";
                string fn = baseLocation + "fxxxupld.inc";

                ftp = new FtpClient(FTPServer, FTPUserName, FTPPassword);
                ftp.Login();
                ftp.Upload(fn);

                AsyncCallback callback = new AsyncCallback(CloseConnection);

                ftp.ChangeDir("results");
                string[] Files = ftp.GetBloombergUploadList();
                int CHigh = Files.GetUpperBound(0);
                String LatestFile = CheckForNewFile(CHigh, ftp);
                ftp.BeginDownload(LatestFile, "c:\\temp\\Results.txt", callback);
            }

        private static string CheckForNewFile(int CHigh,FtpClient ftp)
        {
            int NHigh = 0;
            string LatestFile = "";
            while (CHigh >= NHigh)
            {
                string[] Files = ftp.GetBloombergUploadList();
                NHigh = Files.GetUpperBound(0);
                LatestFile = Files[NHigh-1].ToString();
                Thread.Sleep(3000);
            }
            return LatestFile;
        }

        private void CloseConnection(IAsyncResult result)
        {
            Debug.WriteLine("File downloaded: " + result.IsCompleted.ToString());
            if (ftp != null) ftp.Close();
            ftp = null;
        } 

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

До того, как я добавил AsyncCallback, процесс работал нормально, за исключением того, что пользователь не мог ничего сделать, пока страница не вернулась, и я не мог отображать какой-либо индикатор выполнения и т. д. После добавления в AsyncCallback внезапно часть UPLOAD спамил удаленный конец, и мне удалось их разбить (или, по крайней мере, наше конкретное соединение).

Любые мысли по этому поводу будут оценены ... нужно сказать, что мне нужно наладить процесс правильно, потому что наши трейдеры немного расстраиваются, когда они не могут работать, а Bloomberg немного расстраивается, когда им приходится тратить 3+ часа пытаюсь решить :(

Благодарность!


person Christopher Klein    schedule 09.04.2009    source источник


Ответы (1)


Я предполагаю, что ваш верхний фрагмент кода находится в обработчике Page_Load? И линия

 ftp.Upload(fn);

Является причиной проблемы? Если это так, я бы сказал, что ваши пользователи перезагружали страницу, поэтому это вызывается гораздо чаще, чем раньше.

Вы находитесь на правильном пути, рассматривая асинхронные шаблоны, но похоже, что вам нужно остерегаться случая, когда люди слишком часто обновляют страницу.

person Steve    schedule 09.04.2009
comment
прямо сейчас я тестирую его на пустой странице, я просто использую обработчик Page_Load, чтобы запустить его, обновлять нечего. Может быть, я возьму это оттуда и выкину куда-нибудь еще, просто чтобы исключить это. благодаря. - person Christopher Klein; 09.04.2009
comment
Если вы можете воспроизвести проблему на очень простом примере, возможно, стоит отредактировать образец кода. - person Steve; 10.04.2009