static void MultiThreadsDown(Object tdata) { try { // Establish the remote endpoint for the socket. IPAddress ipAddress; IPAddress.TryParse(url_str, out ipAddress); IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); // Create a TCP/IP socket. Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Connect to the remote endpoint. client.Connect(remoteEP); ThreadPara thdata = (ThreadPara)tdata; string httprequest; httprequest = "GET /" + httpfile + " HTTP/1.1\r\n"; httprequest += "Connection: close\r\n"; httprequest += "Range: bytes=" + thdata.StartPos.ToString() + "-" + thdata.EndPos.ToString() + "\r\n"; httprequest += "Host: 172.16.12.201\r\n"; httprequest += "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)\r\n\r\n"; thdata.dataLen = thdata.EndPos - thdata.StartPos + 1; thdata.msFData.Seek(0, SeekOrigin.Begin); byte[] sendData = Encoding.ASCII.GetBytes(httprequest); client.Send(sendData, SocketFlags.None); byte[] receiveData = new byte[1024]; Int32 recvLen = client.Receive(receiveData, 1024, SocketFlags.None); thdata.msFData.Write(receiveData, 0, recvLen); while (recvLen > 0) { recvLen = client.Receive(receiveData, 1024, SocketFlags.None); thdata.msFData.Write(receiveData, 0, recvLen); } client.Shutdown(SocketShutdown.Both); client.Close(); thdata.eventThreadDone.Set(); } catch (Exception e) { MessageBox.Show(e.ToString()); } }
private void lvCommitsInfo_SelectedIndexChanged(object sender, ListViewItemSelectionChangedEventArgs e) { if (m_lvCommitsInfo.m_emOprType == CCommitsListView.OperationTyPe.MERGE ||m_lvCommitsInfo.m_emOprType == CCommitsListView.OperationTyPe.REBASE ||m_lvCommitsInfo.m_emOprType == CCommitsListView.OperationTyPe.COMPARE) return; if (e.IsSelected == true) { // if(e.ItemIndex!=m_lvCommitsInfo.m_nOldSelectedValue) { m_lvCommitsInfo.m_nOldSelectedValue = e.ItemIndex; } else { return; } m_tabInfo.SelectedIndex = 0; string szSHA = e.Item.Tag.ToString(); //async local operation //by fengzheng ThreadPara ThreadStringParm = new ThreadPara(); ThreadStringParm.szParam = szSHA; ThreadStringParm.ThreadFunc = RefreshGUI_Tab_AsyncLocal; AysncRunLocalOperaWithStringPara(ThreadStringParm); // m_lvCommitsInfo.EnsureVisible(e.ItemIndex); } }
static void threadGETFile() { try { // Establish the remote endpoint for the socket. //IPAddress ipAddress = Dns.GetHostEntry(url_str).AddressList[0]; IPAddress ipAddress; IPAddress.TryParse(url_str, out ipAddress); IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); // Create a TCP/IP socket. Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Connect to the remote endpoint. client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client); connectDone.WaitOne(); // Send test data to the remote device. request = "HEAD /" + httpfile + " HTTP/1.1\r\n"; request += "Connection: close\r\n"; request += "Range: bytes=0-\r\n"; request += "Host: 172.16.12.201\r\n"; request += "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)\r\n\r\n"; Send(client, request); SendMessage(main_wnd_handle, UPDATE_SEND, 100, 100); sendDone.WaitOne(); // Receive the response from the remote device. Receive(client); receiveDone.WaitOne(); // Release the socket. client.Shutdown(SocketShutdown.Both); client.Close(); //获取文件长度信息 long dFileLen = 0; string strFilelen; string[] responLines = totalrespon.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < responLines.Length; i++) { if (responLines[i].IndexOf("Content-Range") > -1) { strFilelen = responLines[i].Substring(responLines[i].IndexOf("/") + 1); dFileLen = Int64.Parse(strFilelen); break; } } long partpos = dFileLen / 2; msFileData0 = new MemoryStream(5000000); msFileData1 = new MemoryStream(5000000); threadsDone[0] = new ManualResetEvent(false); threadsDone[1] = new ManualResetEvent(false); //初始化线程参数 ThreadPara thrPara0 = new ThreadPara(); thrPara0.msFData = msFileData0; thrPara0.eventThreadDone = threadsDone[0]; thrPara0.StartPos = 0; thrPara0.EndPos = partpos; ThreadPara thrPara1 = new ThreadPara(); thrPara1.msFData = msFileData1; thrPara1.eventThreadDone = threadsDone[1]; thrPara1.StartPos = partpos + 1; thrPara1.EndPos = dFileLen - 1; //启动线程下载文件不同部分 Thread Thread0 = new Thread(new ParameterizedThreadStart(MultiThreadsDown)); Thread0.Start(thrPara0); Thread Thread1 = new Thread(new ParameterizedThreadStart(MultiThreadsDown)); Thread1.Start(thrPara1); //同步两个下载线程的结束 WaitHandle.WaitAll(threadsDone); //合并文件内容 byte[] temBuf = new byte[1024]; string filename = "d:\\" + httpfile; FileStream fs = new FileStream(filename, FileMode.CreateNew); ThreadPara[] thParas = new ThreadPara[2]; thParas[0] = thrPara0; thParas[1] = thrPara1; for (int i = 0; i < 2; i++) { thParas[i].msFData.Seek(0, SeekOrigin.Begin); byte[] tData = new byte[4]; int j = 0; //确定报头后的数据位置 for (; j < 1000; j++) { thParas[i].msFData.Seek(j, SeekOrigin.Begin); thParas[i].msFData.Read(tData, 0, 4); if ((tData[0] == 13) && (tData[1] == 10) && (tData[2] == 13) && (tData[3] == 10)) { thParas[i].msFData.Seek(j + 4, SeekOrigin.Begin); break; } } long totalLen = 0; int writeLen = 0; do { writeLen = thParas[i].msFData.Read(temBuf, 0, 1024); fs.Write(temBuf, 0, writeLen); totalLen += writeLen; }while (totalLen < thParas[i].dataLen); } fs.Flush(); fs.Close(); fs.Dispose(); } catch (Exception e) { MessageBox.Show(e.ToString()); } }
//Run download task, public int RunChildFileDownloadTask() { int CurrTaskNum = 0; //This is used to mark the end of ThreadTask ManualResetEvent[] manualEventArray = new ManualResetEvent[cdChildInfoTasks.Count]; //get task from cdChildInfoTasks for (CurrTaskNum = 0; CurrTaskNum < cdChildInfoTasks.Count; CurrTaskNum++) { manualEventArray[CurrTaskNum] = new ManualResetEvent(false); ThreadPara para = new ThreadPara() { m_Event = manualEventArray[CurrTaskNum], num = CurrTaskNum }; ThreadPool.QueueUserWorkItem(RunAChildTask, para); } //wait for all task done WaitHandle.WaitAll(manualEventArray); //clear the task list cdChildInfoTasks.Clear(); return CurrTaskNum; }