public class Form1
{
public delegate void SetStatus (string status);
public event SetStatus SetStatusHandler;
public BackgroundWorker bw = new BackgroundWorker();
public Form1()
{
tbxResult.Text = "Assign text Ok";
SetStatusHandler += delegate(string status)
{
tbxResult.Text = status; // can not assign
};
bw.DoWork += backgroundWorker_DoWork;
bw.RunWorkerAsync();
}
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
var status = "assign some value";
SetStatusHandler(status);
}
}
Во-первых, я попытался установить значение для текстового поля tbxResult на главном потоке внутри BackgroundWorker, но это не сработало, то я использую делегата присвоить значение текстового поля из основной нити, но он тоже не работает ...Невозможно присвоить значение для текстового поля в BackgroundWorker (C# WinForm)
Пожалуйста, помогите мне ... что не так?
Вы не пытаетесь установить его из основного потока. Вызов делегата не переключает поток. Установите 'backgroundWorker.WorkerReportsProgress' в' true', подпишитесь на событие backgroundWorker.ProgressChanged и вызовите 'backgroundWorker.ReportProgress()' вместо 'SetStatusHandler'. Btw: backgroundworker отчасти устарел, попробуйте вместо этого использовать 'async/await'. –
Для этой цели вы должны вызвать 'Control.Invoke'. Читайте для получения более подробной информации [Control.Invoke] (https://msdn.microsoft.com/en-us/library/zyzhdc6b (v = vs.110) .aspx) –