异步方法未运行后执行

时间:2016-04-13 14:12:51

标签: c# wpf asynchronous mvvm task

我的ViewModel中有这个方法:

private async void InicializarModulo(IModuloNeotek modulo)
{
    var t = _service.InitializeModuloAsync(DataProvider.NombreInstanciaSqlServer,
            modulo, Empresa.NombreEmpresa);
    ServiceResult<IModuloNeotek> sResult = await t;

    if (sResult.HasErrors)// this never runs
        MessageBox.Show("Error"); 
}

这是我的服务电话:

public async Task<ServiceResult<IModuloNeotek>> InitializeModuloAsync(string dataSource,
    IModuloNeotek modulo, string nombreEmpresa)
{
    return await Task.Run(() => InitializeModulo(dataSource, modulo, nombreEmpresa));
}

编辑:

public ServiceResult<IModuloNeotek> InitializeModulo(string dataSource, IModuloNeotek modulo, string nombreEmpresa)
{
    ServiceResult<IModuloNeotek> sResult;
    if (DatabaseExists(dataSource, Strings.GetDbName(nombreEmpresa, modulo.NombreModulo)))
        {
            sResult = new ServiceResult<IModuloNeotek>(null);
            sResult.Error =
                string.Format(
                    "El modulo {0} ya esta inicializado para esta empresa.",
                    modulo.NombreModulo);
            return sResult;
        }
        SqlQueryResult qResult = new SqlQueryResult();
        string connString = GenerateConnectionString(dataSource);

        switch (modulo.NombreModulo)
        {
            case "Contabilidad":
                qResult = ExecuteScript(connString, GetScriptStream(TipoModulo.Contabilidad, nombreEmpresa));
                if (qResult.Result)
                {
                    string query =
                        string.Format("INSERT INTO Modulos (NombreModulo, Inicializado, EmpresaId)" +
                                      "VALUES ('{0}', 'true', (SELECT IdEmpresa FROM Empresas WHERE NombreEmpresa=" +
                                      "'{1}')) ", modulo.NombreModulo, nombreEmpresa);

                    qResult = ExeCuteQuery(query, dataSource, Resources.MaterDbName);
                    if (qResult.Result)
                    {
                        sResult = new ServiceResult<IModuloNeotek>(modulo);
                        return sResult;
                    }
                }
                break;
            case "Proveedores":
                break;
            case "Produccion":
                break;
        }
        sResult = new ServiceResult<IModuloNeotek>(null);
        sResult.Error = qResult.Error;
        sResult.InnerError = qResult.InnerError;
        return sResult;
}

那么,为什么不继续执行呢?我尝试了所有的东西,从服务中返回一个Task并在ViewModel中等待,而不是返回Task.Run,只是任务,我不知道该做什么,任何线索?感谢

2 个答案:

答案 0 :(得分:0)

尝试更改:

private async void InicializarModulo(IModuloNeotek modulo)

为:

private async Task InicializarModulo(IModuloNeotek modulo)

答案 1 :(得分:0)

您的服务电话不正确。它已经awaiting了。

更新至await

private async void InicializarModulo(IModuloNeotek modulo)
{
    var t = _service.InitializeModuloAsync(DataProvider.NombreInstanciaSqlServer, modulo, Empresa.NombreEmpresa);
    ServiceResult<IModuloNeotek> sResult = await t;

    if (sResult.HasErrors)// this never runs
        MessageBox.Show("Error"); 
}

public Task<ServiceResult<IModuloNeotek>> InitializeModuloAsync(string dataSource, IModuloNeotek modulo, string nombreEmpresa)
{
    return Task.Run(() => InitializeModulo(dataSource, modulo, nombreEmpresa));
}