C # Как превратить действие T в ожидаемую функцию задачи T - PullRequest
0 голосов
/ 17 сентября 2018

Я бы хотел сохранить некоторые методы как действия и соответствующие им асинхронные аналоги. Для этого мне нужно превратить их в Func<Task>.

У меня это работает.

public class Class1 {
    Action myAction;
    Func<Task> myFunc;

    public Class1() {
        // for demo purposes I use a local method
        void MyVoidMethod() {
            // some code
        }
        myAction = MyVoidMethod;
        myFunc = () => Task.Factory.StartNew(myAction);
    }

    public async void AnotherMethod() {
        // later in async some method
        await myFunc.Invoke();
    }
}

Но как мне объявить это, когда я также хочу иметь необязательный входной параметр, например, чтобы сообщить о прогрессе в асинхронной функции? Я не понимаю, как работает синтаксис для этого.

public class Class2 {
    Action<IProgress<bool>> myAction;
    Func<Task<IProgress<bool>>> myFunc;

    public Class2() {
        void MyVoidMethod(IProgress<bool> prog = null) {
            // some code
        }
        myAction = MyVoidMethod;
        // line below gives squiggelies under `myAction`
        myFunc = () => Task.Factory.StartNew(myAction);
    }

    public async void AnotherMethod() {
        // later in async some method
        var prog = new Progress<bool>();
        prog.ProgressChanged += (s, e) => {
            // do something with e
        };
        await myFunc.Invoke(prog);
    }
}

1 Ответ

0 голосов
/ 17 сентября 2018

Вы определяете, что myFunc принимает задачу, а не возвращает ее, вам нужно определить функцию, которая будет принимать IProgress, и возвращать задачу как результат.

Func<IProgress<bool>, Task> myFunc;

Затем вам нужно передатьпрогресс к методу выполнения в вашей лямбде

this.myFunc = p => Task.Factory.StartNew(() => this.MyVoidMethod(p))

И ваш AnotherMethod должен принимать Progress в качестве параметра

public async void AnotherMethod(IProgress<bool> progress)
{
    await this.myFunc.Invoke(progress);
}
...