Как в функции thr1 прочитать данные из файла в потоке и вывести их в label

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO;

namespace thread
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(thr);
            Thread t1 = new Thread(thr1);
            t.Start();
            t1.Start();
        }

        public void thr()
        {
            Thread.Sleep(1000);
            FileStream tt = new FileStream("file.txt", FileMode.Create); //создаем файловый поток
            StreamWriter writer = new StreamWriter(tt); //создаем «потоковый писатель» и связываем его с файловым потоком
            writer.Write("Text in file"); //записываем в файл
            writer.Close(); //закрываем поток. Не закрыв поток, в файл ничего не запишется
        }
        public void thr1()
        {
            Thread.Sleep(1000);
            File.ReadAllText("file.txt");

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}

Ответы (1 шт):

Автор решения: frozencoast
  1. Поскольку вы пытаетесь прочитать данные из файла одновременно с записью в этот файл, это вызовет ошибку (файл занят, файл не существует), поэтому необходимо, чтобы был промежуток, между запуском этих потоков
  2. Невозможно изменить свойства элемента формы из потока - одно из решений это использовать делегат

Попробуйте этот код, не забудьте присвоить лейблу имя label1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO;

namespace thread
{
    public partial class Form1 : Form
    {
        delegate void SetLabel1TextDelegate(Control ctrl, string text);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(thr);
            Thread t1 = new Thread(thr1);
            t.Start();
            t1.Start();
        }

        public void thr()
        {
            Thread.Sleep(1000);
            FileStream tt = new FileStream("file.txt", FileMode.Create);
            StreamWriter writer = new StreamWriter(tt);
            writer.Write("Text in file"); //записываем в файл
            writer.Close();
        }
        public void thr1()
        {
            Thread.Sleep(2000);
            SetLabel1Text(label1, File.ReadAllText("file.txt"));
        }

        public static void SetLabel1Text(Control label, string text)
        {
            if (label.InvokeRequired)
            {
                SetLabel1TextDelegate del = new SetLabel1TextDelegate(SetLabel1Text);
                label.Invoke(del, label, text);
            }
            else
            {
                label.Text = text;
            }
        }
    }
}
→ Ссылка