欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
借助WebService實(shí)現多線(xiàn)程上傳文件
http://www.cnblogs.com/thx-bj/archive/2008/04/22/1165502.html

WebService的幫助下,進(jìn)行多線(xiàn)程上傳文件是非常簡(jiǎn)單。因此我只做個(gè)簡(jiǎn)單的例子,那么如果想要實(shí)現此功能的朋友,可以在我的基礎上進(jìn)行擴展。

 

首先說(shuō)說(shuō)服務(wù)器端,只需要提供一個(gè)能允許多線(xiàn)程寫(xiě)文件的函數即可,具體代碼如下。

[WebMethod]

public bool UploadFileData( string FileName, int StartPosition, byte[] bData )

{

    string strFullName = Server.MapPath( "Uploads" ) + @""" + FileName;

    FileStream fs = null;

    try

    {

        fs = new FileStream( strFullName, FileMode.OpenOrCreate,

            FileAccess.Write, FileShare.Write );

    }

    catch( IOException err )

    {

        Session["ErrorMessage"] = err.Message;

        return false;

    }

    using( fs )

    {

        fs.Position = StartPosition;

        fs.Write( bData, 0, bData.Length );

    }

    return true;

}

 

其中“Uploads”是在服務(wù)程序所在目錄下的一個(gè)子目錄,需要設置ASPNET用戶(hù)對此目錄具有可寫(xiě)權限。

 

相對于服務(wù)器端來(lái)說(shuō),客戶(hù)端要稍微復雜一些,因為要牽扯到多線(xiàn)程的問(wèn)題。為了更好的傳遞參數,我用一個(gè)線(xiàn)程類(lèi)來(lái)完成。具體如下。

    public delegate void UploadFileData( string FileName, int StartPos, byte[] bData );

    ///<summary>

    /// FileThread: a class for sub-thread

    ///</summary>

    sealed class FileThread

    {

        private int nStartPos;

        private int nTotalBytes;

        private string strFileName;

        public static UploadFileData UploadHandle;

        ///<summary>

        /// Constructor

        ///</summary>

        ///<param name="StartPos"></param>

        ///<param name="TotalBytes"></param>

        ///<param name="FileName"></param>

        public FileThread( int StartPos, int TotalBytes, string FileName )

        {

            //Init thread variant

            nStartPos = StartPos;

            nTotalBytes = TotalBytes;

            strFileName = FileName;

            //Only for debug

            Debug.WriteLine( string.Format( "File name:{0} position: {1} total byte:{2}",

                strFileName, nStartPos, nTotalBytes ) );

        }

        ///<summary>

        /// Sub-thread entry function

        ///</summary>

        ///<param name="stateinfo"></param>

        public void UploadFile( object stateinfo )

        {

            int nRealRead, nBufferSize;

            const int BUFFER_SIZE = 10240;

            using( FileStream fs = new FileStream( strFileName,

                       FileMode.Open, FileAccess.Read,

                       FileShare.Read ) )

            {

                string sName = strFileName.Substring( strFileName.LastIndexOf( """" ) + 1 );

                byte[] bBuffer = new byte[BUFFER_SIZE];//Init 10k buffer

                fs.Position = nStartPos;

                nRealRead = 0;

                do

                {

                    nBufferSize = BUFFER_SIZE;

                    if( nRealRead + BUFFER_SIZE > nTotalBytes )

                        nBufferSize = nTotalBytes - nRealRead;

                    nBufferSize = fs.Read( bBuffer, 0, nBufferSize );

                    if( nBufferSize == BUFFER_SIZE )

                        UploadHandle( sName,

                            nRealRead + nStartPos,

                            bBuffer );

                    else if( nBufferSize > 0 )

                    {

                        //Copy data

                        byte[] bytData = new byte[nBufferSize];

                        Array.Copy( bBuffer,0, bytData, 0, nBufferSize );

                        UploadHandle( sName,

                            nRealRead + nStartPos,

                            bytData );

                    }

                    nRealRead += nBufferSize;

                }

                while( nRealRead < nTotalBytes );

            }

            //Release signal

            ManualResetEvent mr = stateinfo as ManualResetEvent;

            if( mr != null )

                mr.Set();

        }

    }

 

那么在執行的時(shí)候,要創(chuàng )建線(xiàn)程類(lèi)對象,并為每一個(gè)每個(gè)線(xiàn)程設置一個(gè)信號量,從而能在所有線(xiàn)程都結束的時(shí)候得到通知,大致的代碼如下。

    FileInfo fi = new FileInfo( txtFileName.Text );

    if( fi.Exists )

    {

        btnUpload.Enabled = false;//Avoid upload twice

        //Init signals

        ManualResetEvent[] events = new ManualResetEvent[5];

        //Devide blocks

        int nTotalBytes = (int)( fi.Length / 5 );

        forint i = 0; i < 5; i++ )

        {

            events[i] = new ManualResetEvent( false );

            FileThread thdSub = new FileThread(

                i * nTotalBytes,

                ( fi.Length - i * nTotalBytes ) > nTotalBytes ? nTotalBytes:(int)( fi.Length - i * nTotalBytes ),

                fi.FullName );

            ThreadPool.QueueUserWorkItem( new WaitCallback( thdSub.UploadFile ), events[i] );

        }

        //Wait for threads finished

        WaitHandle.WaitAll( events );

        //Reset button status

        btnUpload.Enabled = true;

    }

 

總體來(lái)說(shuō),程序還是相對比較簡(jiǎn)單,而我也只是做了個(gè)簡(jiǎn)單例子而已,一些細節都沒(méi)有進(jìn)行處理。

 

本來(lái)想打包提供給大家下載,沒(méi)想到CSDNBlog對于這點(diǎn)做的太差,老是異常。

如下是客戶(hù)端的完整代碼。

//--------------------------- Multi-thread Upload Demo ---------------------------------------

//--------------------------------------------------------------------------------------------

//---File:          frmUpload

//---Description:   The multi-thread upload form file to demenstrate howto use multi-thread to

//                  upload files

//---Author:        Knight

//---Date:          Oct.12, 2006

//--------------------------------------------------------------------------------------------

//---------------------------{Multi-thread Upload Demo}---------------------------------------

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace CSUpload

{

    using System.IO;

    using System.Diagnostics;

    using System.Threading;

    using WSUploadFile;//Web-service reference namespace

    ///<summary>

    /// Summary description for Form1.

    ///</summary>

    public class frmUpload : System.Windows.Forms.Form

    {

        private System.Windows.Forms.TextBox txtFileName;

        private System.Windows.Forms.Button btnBrowse;

        private System.Windows.Forms.Button btnUpload;

        ///<summary>

        /// Required designer variable.

        ///</summary>

        private System.ComponentModel.Container components = null;

        public frmUpload()

        {

            //

            // Required for Windows Form Designer support

            //

            InitializeComponent();

            //

            // TODO: Add any constructor code after InitializeComponent call

            //

        }

        ///<summary>

        /// Clean up any resources being used.

        ///</summary>

        protected override void Dispose( bool disposing )

        {

            if( disposing )

            {

                if (components != null)

                {

                    components.Dispose();

                }

            }

            base.Dispose( disposing );

        }

        #region Windows Form Designer generated code

        ///<summary>

        /// Required method for Designer support - do not modify

        /// the contents of this method with the code editor.

        ///</summary>

        private void InitializeComponent()

        {

            this.txtFileName = new System.Windows.Forms.TextBox();

            this.btnBrowse = new System.Windows.Forms.Button();

            this.btnUpload = new System.Windows.Forms.Button();

            this.SuspendLayout();

            //

            // txtFileName

            //

            this.txtFileName.Location = new System.Drawing.Point(16, 24);

            this.txtFileName.Name = "txtFileName";

            this.txtFileName.Size = new System.Drawing.Size(248, 20);

            this.txtFileName.TabIndex = 0;

            this.txtFileName.Text = "";

            //

            // btnBrowse

            //

            this.btnBrowse.Location = new System.Drawing.Point(272, 24);

            this.btnBrowse.Name = "btnBrowse";

            this.btnBrowse.TabIndex = 1;

            this.btnBrowse.Text = "&Browse...";

            this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);

            //

            // btnUpload

            //

            this.btnUpload.Location = new System.Drawing.Point(272, 56);

            this.btnUpload.Name = "btnUpload";

            this.btnUpload.TabIndex = 2;

            this.btnUpload.Text = "&Upload";

            this.btnUpload.Click += new System.EventHandler(this.btnUpload_Click);

            //

            // frmUpload

            //

            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

            this.ClientSize = new System.Drawing.Size(370, 111);

            this.Controls.Add(this.btnUpload);

            this.Controls.Add(this.btnBrowse);

            this.Controls.Add(this.txtFileName);

            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;

            this.MaximizeBox = false;

            this.Name = "frmUpload";

            this.Text = "Upload";

            this.Load += new System.EventHandler(this.frmUpload_Load);

            this.ResumeLayout(false);

        }

        #endregion

        ///<summary>

        /// The main entry point for the application.

        ///</summary>

        static void Main()

        {

            Application.Run(new frmUpload());

        }

        private FileUpload myUpload = new FileUpload();

        private void UploadData( string FileName, int StartPos, byte[] bData )

        {

            //Call web service upload

            myUpload.UploadFileData( FileName, StartPos, bData );

        }

        private void btnUpload_Click(object sender, System.EventArgs e)

        {

            FileInfo fi = new FileInfo( txtFileName.Text );

            if( fi.Exists )

            {

                btnUpload.Enabled = false;//Avoid upload twice

                //Init signals

                ManualResetEvent[] events = new ManualResetEvent[5];

                //Devide blocks

                int nTotalBytes = (int)( fi.Length / 5 );

                forint i = 0; i < 5; i++ )

                {

                    events[i] = new ManualResetEvent( false );

                    FileThread thdSub = new FileThread(

                        i * nTotalBytes,

                        ( fi.Length - i * nTotalBytes ) > nTotalBytes ? nTotalBytes:(int)( fi.Length - i * nTotalBytes ),

                        fi.FullName );

                    ThreadPool.QueueUserWorkItem( new WaitCallback( thdSub.UploadFile ), events[i] );

                }

                //Wait for threads finished

                WaitHandle.WaitAll( events );

                //Reset button status

                btnUpload.Enabled = true;

            }

       

        }

        private void frmUpload_Load(object sender, System.EventArgs e)

        {

            FileThread.UploadHandle = new UploadFileData( this.UploadData );

        }

        private void btnBrowse_Click(object sender, System.EventArgs e)

        {

            if( fileOpen.ShowDialog() == DialogResult.OK )

                txtFileName.Text = fileOpen.FileName;

        }

        private OpenFileDialog fileOpen = new OpenFileDialog();

       

    }

    public delegate void UploadFileData( string FileName, int StartPos, byte[] bData );

    ///<summary>

    /// FileThread: a class for sub-thread

    ///</summary>

    sealed class FileThread

    {

        private int nStartPos;

        private int nTotalBytes;

        private string strFileName;

        public static UploadFileData UploadHandle;

        ///<summary>

        /// Constructor

        ///</summary>

        ///<param name="StartPos"></param>

        ///<param name="TotalBytes"></param>

        ///<param name="FileName"></param>

        public FileThread( int StartPos, int TotalBytes, string FileName )

        {

            //Init thread variant

            nStartPos = StartPos;

            nTotalBytes = TotalBytes;

            strFileName = FileName;

            //Only for debug

            Debug.WriteLine( string.Format( "File name:{0} position: {1} total byte:{2}",

                strFileName, nStartPos, nTotalBytes ) );

        }

        ///<summary>

        /// Sub-thread entry function

        ///</summary>

        ///<param name="stateinfo"></param>

        public void UploadFile( object stateinfo )

        {

            int nRealRead, nBufferSize;

            const int BUFFER_SIZE = 10240;

            using( FileStream fs = new FileStream( strFileName,

                       FileMode.Open, FileAccess.Read,

                       FileShare.Read ) )

            {

                string sName = strFileName.Substring( strFileName.LastIndexOf( """" ) + 1 );

                byte[] bBuffer = new byte[BUFFER_SIZE];//Init 10k buffer

                fs.Position = nStartPos;

                nRealRead = 0;

                do

                {

                    nBufferSize = BUFFER_SIZE;

                    if( nRealRead + BUFFER_SIZE > nTotalBytes )

                        nBufferSize = nTotalBytes - nRealRead;

                    nBufferSize = fs.Read( bBuffer, 0, nBufferSize );

                    if( nBufferSize == BUFFER_SIZE )

                        UploadHandle( sName,

                            nRealRead + nStartPos,

                            bBuffer );

                    else if( nBufferSize > 0 )

                    {

                        //Copy data

                        byte[] bytData = new byte[nBufferSize];

                        Array.Copy( bBuffer,0, bytData, 0, nBufferSize );

                        UploadHandle( sName,

                            nRealRead + nStartPos,

                            bytData );

                    }

                    nRealRead += nBufferSize;

                }

                while( nRealRead < nTotalBytes );

            }

            //Release signal

            ManualResetEvent mr = stateinfo as ManualResetEvent;

            if( mr != null )

                mr.Set();

        }

    }

}


( # )

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
用 WebClient.UploadData 方法 上載文件數據
C#多線(xiàn)程寫(xiě)日志
ASP.NET上傳圖片
圖片及文件上傳和下載
如何在asp.net中如何在線(xiàn)播放視頻文件
利用WebClient類(lèi)向服務(wù)器上載文件
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久