Sửa giúp lỗi Cross-Thread trong bài truyền nhận file qua mạng LAN

Discussion in 'Ngôn ngữ lập trình khác (Pascal, C#, VB, ...)' started by vnjava, 9/12/12.

  1. vnjava Member

    Hic Mình có tham khảo bài này mà khi click vào button Save file thì nó báo lỗi Cross-thread operation not valid: Control 'Client' accessed from a thread other than the thread it was created on. ở hàm SaveFile dòng if (saveFileDialog1.ShowDialog(this) == DialogResult.OK), mình không biết sửa, hình như phải thêm đoạn code private delegate void..... và 1 hàm private void với phương thức triệu gọi invoke gì đó như trên mạng bày mà chả biết thêm thế nào cả. bạn nào sửa giúp mình với.

    Bài đó đây:
    http://www.mediafire.com/?e9bf3sb84f4e6c8

    Code đây:
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Net.Sockets;
    using System.Net;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    #pragma warning disable
    
    namespace GuiClient
    {
        public partial class Client : Form
        {
            public delegate void UpdateListBoxCallBack(string s);
            public delegate void UpdateLabelCallBack(string s);
            private Stream stmReader = null;
            private NetworkStream nwkStream = null;
            private Stream stmWriter = null;
            private TcpClient tcpClient = null;
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            public Client()
            {
                InitializeComponent();
            }
            private void Save(object sender, EventArgs e)
            {
               Thread t = new Thread(new ThreadStart(SaveFile));
                t.Start();
            }
            public void SaveFile()
            {
                if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
                {
                    txtFileName.Text = saveFileDialog1.FileName;
                    set(null);
                }
                try
                {
                    nwkStream = tcpClient.GetStream();
                    stmReader = nwkStream;
                    stmWriter = File.OpenWrite(txtFileName.Text);
                    byte[] buff = new byte[1024];
                    int len = 0;
                    set("Receiving");
    
                    while ((len = stmReader.Read(buff, 0, 1024)) > 0)
                    {
                        stmWriter.Write(buff, 0, len);
                        stmWriter.Flush();
                    }
                    set("File has received succesfully!");
                }
                catch (Exception ex) {
                    MessageBox.Show(ex.ToString());
                }
                
                finally
                {
                    nwkStream.Close();
                    stmWriter.Close();
                    stmReader.Close();
                }
            }
    
            public void Start(object sender, EventArgs e)
            {
                txtFileName.Clear();
                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipserver.Text), int.Parse(port.Text));
                tcpClient = new TcpClient();
                tcpClient.Connect(ipe);
                StreamReader sr = new StreamReader(tcpClient.GetStream());
                StreamWriter sw = new StreamWriter(tcpClient.GetStream());
                string duongdan = sr.ReadLine() ;
                textBox1.Text = "Server gui file : " + duongdan;
                saveFileDialog1.FileName = duongdan;
                saveFileDialog1.Title = "Luu File Tu Server";
                saveFileDialog1.Filter = "Text Files (*.txt)|*.txt|Word Documents" + "(*.doc)|*.doc|All Files (*.*)|*.*";
                saveFileDialog1.ShowHelp = true;
            }
            void set(string s)
            {
                if (InvokeRequired)
                {
                    object[] pList = { s };
                    lblMessage.BeginInvoke(new UpdateListBoxCallBack(OnUpdateLabel), pList);
                }
                else
                {
                    OnUpdateLabel(s);
                }
            }
            private void OnUpdateLabel(String s)
            {
                lblMessage.Text = s;
            }
    
            private void clearip(object sender, EventArgs e)
            {
                ipserver.Clear();
            }
    
            private void clearport(object sender, EventArgs e)
            {
                port.Clear();
            }
    
            private void clearfilename(object sender, EventArgs e)
            {
                txtFileName.Clear();
            }
    
            private void exit(object sender, EventArgs e)
            {
                Close();
            }
    
            private void disconectToolStripMenuItem_Click(object sender, EventArgs e)
            {
                nwkStream.Close();
                stmWriter.Close();
                stmReader.Close();
            }
        }
    }

Chia sẻ trang này



Ve may bay di Ha Noi | Ve may bay di Vinh | Ve may bay di Hue | Ve may bay di Da Nang | Ve may bay di Nha Trang | Ve may bay di Da Lat | Ve may bay di Phu Quoc | Ve may bay di Sai Gon | Ve may bay di TPHCM | Ve may bay di Buon Me Thuot | Ve may bay di Hai Phong | Ve may bay di Dong Hoi | Ve may bay Vietjet Air | Phong ve may bay Vietjet Air | Ve may bay Vietnam Airlines | Phong ve may bay Vietnam Airlines | Ve may bay Vietnam Airlines | Ve may bay gia re | Ve may bay | Mua ve may bay | Jetstar | Vietnam Airlines | Air Asia | Tiger Airways | Ve may bay di My | Vietjet Air | Ve may bay di Ha Noi | Ve may bay di Da Nang | Ve may bay di Hai Phong | Ve may bay di Vinh