代码之家  ›  专栏  ›  技术社区  ›  deostroll

WaitHandle.WaitAny,等等() & WaitHandle.WaitAll文件()使用问题

  •  0
  • deostroll  · 技术社区  · 15 年前

    下面是代码。。。

    using System;
    using System.Net;
    using System.Threading;
    using System.IO;
    using System.Text;
    
    namespace ServicePointDemo
    {
        class Program
        {
            struct UploadState
            {
                public string Filename;
                public AutoResetEvent are;
            }
    
            static void Main(string[] args)
            {
                AutoResetEvent are = new AutoResetEvent(false);
                ServicePoint sp = ServicePointManager.FindServicePoint(new Uri("ftp://xxx.xxx.xxx.xxx/public"));
    
                UploadState us1 = new UploadState();
                us1.are = new AutoResetEvent(false);
                us1.Filename = @"C:\inventory.xls";
    
                UploadState us2 = new UploadState();
                us2.are = new AutoResetEvent(false);
                us2.Filename = @"C:\somefile.txt";
    
                Thread t1, t2;
                t1 = new Thread(new ParameterizedThreadStart(DoUpload));
                t2 = new Thread(new ParameterizedThreadStart(DoUpload));
    
                t1.Start(us1);            
                t2.Start(us2);
    
                Console.WriteLine("Waiting for something to trigger up");
                WaitHandle.WaitAny(new WaitHandle[] { us1.are, us2.are });            
    
                Console.WriteLine("CurrentConnections = {0}", sp.CurrentConnections);
                Console.WriteLine("Waiting for all operations to complete...");            
                WaitHandle.WaitAll(new WaitHandle[] { us1.are, us2.are });
    
                Console.WriteLine("Press enter to quit");
                Console.ReadLine();
            }
    
            static void DoUpload(object state)
            {
                string filename = ((UploadState)state).Filename;
                FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://172.16.130.22/public/" + Path.GetFileName(filename));
                Console.WriteLine("Upload URI = {0}", ftpRequest.RequestUri.AbsoluteUri);
                ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
                ftpRequest.Credentials = new NetworkCredential("anonymous", "guest@");
                ftpRequest.Proxy = new WebProxy();
                Stream stream = null;
                FileStream file = new FileStream(filename, FileMode.Open);
                Console.WriteLine("Total file size of {0} = {1}", filename, file.Length);
                StreamReader rdr = new StreamReader(file);
                Console.WriteLine("Getting bytes of {0}", filename);
                byte[] fileBytes = Encoding.ASCII.GetBytes(rdr.ReadToEnd());
                rdr.Close();
                Console.WriteLine("Acquiring connection of {0} upload...", filename);
                try
                {
                    stream = ftpRequest.GetRequestStream();
                    Console.WriteLine("Upload of {0} has acquired a connection", filename);
                    ((UploadState)state).are.Set();
                    stream.Write(fileBytes, 0, fileBytes.Length);
                    Console.WriteLine("Uploading {0} complete", filename);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception has occurred: {0}", ex.Message);                
                }
                finally
                {
                    Console.WriteLine("Ending uploading {0}", filename);
                    stream.Close();
                    ((UploadState)state).are.Set();                
                }
                Console.WriteLine("Quit DoUpload() for {0}", filename);//...is not executed(?)
            }
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   Simon P Stevens    15 年前

    你的自动重置事件似乎有种族问题

    我建议你使用两个独立的自动重置事件(或者简单的 EventWaitHandles

        2
  •  0
  •   Matt Davis    15 年前

    用对每个线程的Join()调用替换WaitAll()调用。

    are 在Main()中,因为它没有被使用。