User Tag List

+ Trả lời chủ đề
Hiện kết quả từ 1 tới 2 của 2

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

  1. #1
    svBK's Member Avatar của hnvn
    Tham gia ngày
    Mar 2012
    Bài gửi
    93

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

    Hic Mình có bài tập 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..... 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:
    Mã:
    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();
            }
        }
    }
    Ha Noi Capital - Viet Nam - Sinh vien khoa 2009

  2. #2
    HUT's Engineer
    Tham gia ngày
    Jun 2011
    Bài gửi
    686

    Mặc định Re: Sửa giúp lỗi Cross-Thread trong bài truyền nhận file qua mạng LAN

    vấn đề ở đây là bạn tạo đối tượng this ở một thread và lại sử dụng (đọc giá trị) nó ở một thread khác

    để giải quyết vấn đề này, bạn dùng BeginInvoke để gọi phương thức Save, mình thấy trong code của bạn có dòng

    lblMessage.BeginInvoke(new UpdateListBoxCallBack(OnUpdateLabel), pList);

    thì thôi, ko cần giải thích nhiều nữa nhỉ.

+ Trả lời chủ đề

Thông tin chủ đề

Users Browsing this Thread

Hiện có 1 người đọc bài này. (0 thành viên và 1 khách)

Từ khóa (Tag) của chủ đề này

Quyền viết bài

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình


About svBK.VN

    Bách Khoa Forum - Diễn đàn thảo luận chung của sinh viên ĐH Bách Khoa Hà Nội. Nơi giao lưu giữa sinh viên - cựu sinh viên - giảng viên của trường.

Follow us on

Twitter Facebook youtube