Передать в Invoke параметр с ref

163
18 января 2022, 17:40

Пытаюсь использовать 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". Получается, что нет никакой возможности его туда передать?

Answer 1

Отдельный тип делегата не потребовался, вот такое компилируется:

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

READ ALSO
Доступ к control-у не из того потока, в котором он был создан без Invoke

Доступ к control-у не из того потока, в котором он был создан без Invoke

Раньше я часто использовал Invoke для решения подобных проблем, и проблем никогда не былоНо слышал, что с появлением async/await эта проблема решена

74
Добавление кнопки с ссылкой

Добавление кнопки с ссылкой

Коллеги, доброго времени сутокУ меня меня есть страница формата "

63
С# задать значение переменной - вызвать метод

С# задать значение переменной - вызвать метод

Добрый день дамы и господа) набросал тут вот такой код:

69