将值发送到另一个ViewModel并异步

时间:2018-07-12 15:23:45

标签: c# wpf mvvm

public async void GetUserInfo()
{
    try
    {
        using (SqlConnection conn =
            new SqlConnection(ConfigurationManager.ConnectionStrings["Connect"].ConnectionString))
        {
            await conn.OpenAsync();
            using (SqlCommand command =
                new SqlCommand("SELECT * from XTable", conn));
            {

                using (SqlDataReader reader = await command.ExecuteReaderAsync())
                {
                    if (await reader.ReadAsync())
                        Code_abc = reader.GetInt32(0);

                    reader.Close();
                    conn.Close();
                }
            }
        }
        Console.WriteLine("1");
    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());
    }
}

和:

public XViewModel(int UserID)
{  
    GetUserInfo();
    EmployeListBox = new[]
    {
        new EmployeListBoxItems(PackIconKind.UndoVariant, "Listing", new YWindow( new YViewModel(Code_abc)) ),
    };
    Console.WriteLine("3");   
}

当我看到调试输出时

3
1

我不确定这是否与ASYNC有关,但根据调试输出,我正在创建表单和ViewModel,然后获取查询结果,因此基本上是{{1} }我正在发送的是0,而不是实际值。

如果我先打code_abc,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

因为您没有await GetUserInfo(),它会在将“ 1”打印到控制台之前返回。

为使您能够使用await方法,应将其返回类型从void更改为Task

public async Task GetUserInfo()

但是即使那样,您也无法从构造函数中像这样await

await GetUserInfo();
...
Console.WriteLine("3"); 

您不应从构造函数中调用async方法。

如果您从标记为async的方法中这样调用它,则应该在控制台中看到“ 1”打印在“ 3”之前:

public async Task SomeAsyncMethod (int UserID)
{
    await GetUserInfo();
    EmployeListBox = new[]
    {
        new EmployeListBoxItems(PackIconKind.UndoVariant, "Listing", new YWindow( new YViewModel(Code_abc)) ),
    };
    Console.WriteLine("3");
}