如何从构造函数中调用异步方法?

时间:2015-03-14 21:06:21

标签: c# winforms constructor async-await

我需要从async构造函数中调用Form1方法。由于构造函数不具有返回类型,因此我无法添加async void。我读到static constructor可以是async,但我需要调用构造函数中不是static的方法,例如InitializeComponent()(因为它是public partial class Form1 : Form { InitializeComponent(); //some stuff await myMethod(); } 形式的构造函数)。

课程是:

async

我也读了this,但我仍然不知道如何实现这个(在我的情况下),因为该方法仍然需要使用{{1}}。

5 个答案:

答案 0 :(得分:16)

不要在构造函数中执行此操作,而是在窗口的已加载事件中执行此操作。 您可以将加载的事件处理程序标记为异步。

答案 1 :(得分:8)

您可以使用返回表单实例的静态方法

public class TestForm : Form
{
    private TestForm()
    {
    }

    public static async Task<TestForm> Create()
    {
        await myMethod();
        return new TestForm();
    }
}

答案 2 :(得分:0)

我的示例是从页面构造函数中调用学生详细信息

1-调用导航页面

    void Handle_ItemTapped(object sender, Xamarin.Forms.ItemTappedEventArgs e)
    {
        Student _student = (Student)e.Item;
        Navigation.PushAsync(new Student_Details(_student.ID));

    }

2 - 详情页面

public partial class Student_Details : ContentPage
{
    public Student_Details(int id)
    {
        InitializeComponent();
        Task.Run(async () => await getStudent(id));
    }

    public async Task<int> getStudent(int id)
    {
        Student _student;
        SQLiteDatabase db = new SQLiteDatabase();
        _student = await db.getStudent(id);
        return 0;
    }
}

答案 3 :(得分:0)

虽然通常的建议表明您通常不应该在构造函数中执行此操作,但是您可以执行以下操作,这些操作已在我需要调用一些现有异步代码的控制台应用程序之类的应用程序中使用:

DetailsModel details = null; // holds the eventual result
var apiTask = new Task(() => details = MyService.GetDetailsAsync(id).Result); // creates the task with the call on another thread
apiTask.Start(); // starts the task - important, or you'll spin forever
Task.WaitAll(apiTask); // waits for it to complete

Philip是正确的,如果您可以避免在构造函数中这样做,那么应该这样做。

答案 4 :(得分:-5)

Task.Run(async () => await YourAsyncMethod());