Как в функции 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
→ Ссылка
- Поскольку вы пытаетесь прочитать данные из файла одновременно с записью в этот файл, это вызовет ошибку (файл занят, файл не существует), поэтому необходимо, чтобы был промежуток, между запуском этих потоков
- Невозможно изменить свойства элемента формы из потока - одно из решений это использовать делегат
Попробуйте этот код, не забудьте присвоить лейблу имя 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;
}
}
}
}