Пытаюсь использовать Invoke для того, чтобы использовать winform-контролы в другом потоке. И один из аргументов у меня по задумке должен быть ref. Столкнувшись с тем, что лямбды не умеют принимать ref, создал кастомный делегат:
delegate void MyAction(string source, string path, RichTextBox logText, ref bool? _flag);
Далее создаю его экземпляр:
MyAction Scope = new MyAction(
delegate (string source, string path, RichTextBox logText, ref bool? _flag)
{
Scope_Save(source, path, logText, ref _flag);
});
И в конце концов пытаюсь использовать так:
await Task.Factory.StartNew(
() => {
this.Invoke(Scope, sourceText.Text, folderPath, statusView, ref flag);
},
TaskCreationOptions.LongRunning
);
Но компилятор не хочет там видеть ref. Дословно: "аргумент 5
не должен передаваться к ключевым словом ref". Получается, что нет никакой возможности его туда передать?
Отдельный тип делегата не потребовался, вот такое компилируется:
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinFormsLambdaRef
{
public partial class Form1 : Form
{
private bool? _flag;
public Form1()
{
InitializeComponent();
}
public async Task DoTheWork()
{
await Task.Factory.StartNew(
() => {
this.Invoke((MethodInvoker)(() =>
{
Scope_Save("", "", null, ref _flag);
}));
},
TaskCreationOptions.LongRunning
);
}
private void Scope_Save(string source, string path, RichTextBox logText, ref bool? flag)
{
}
}
}
Видео о том, как делался ответ на вопрос: https://youtu.be/OBAZ9SwSpvs
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Раньше я часто использовал Invoke для решения подобных проблем, и проблем никогда не былоНо слышал, что с появлением async/await эта проблема решена
Добрый день дамы и господа) набросал тут вот такой код: