【问题标题】:Execution after Async method not running异步方法未运行后执行
【发布时间】:2016-08-04 17:00:18
【问题描述】:

我的 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;
}

那么,为什么它不继续执行?我尝试了一切,从服务返回一个任务并在 ViewModel 中等待,不返回Task.Run,只是任务,我不知道该怎么做,有什么线索吗?谢谢

【问题讨论】:

  • 显示InitializeModulo(dataSource, modulo, nombreEmpresa)的定义

标签: c# wpf asynchronous mvvm task


【解决方案1】:

尝试改变:

private async void InicializarModulo(IModuloNeotek modulo)

到:

private async Task InicializarModulo(IModuloNeotek modulo)

【讨论】:

  • 我不知道发生了什么,我已经使用了同样的模式并且工作了,现在不行了!
  • 尝试通过输入try { ... code here ... } catch (Exception ex) { }来调试您的代码并在任务中捕获异常
  • 另外,您的主线程是否仍在运行,还是在任务完成之前退出?您可能必须等待任务完成,以便您的主线程继续运行。
  • 我怎么知道?我只知道代码没有到达
  • 不,没有抓到任何东西
【解决方案2】:

您的服务调用不正确。它本身已经是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));
}

【讨论】:

  • 好的,我的 DataProvider 出现错误,没有提供 Sql Server 名称,我修复了它,现在它可以工作了,但为什么我没有收到任何错误?我不明白
  • 不知道为什么你没有收到错误。他们是“第一次机会例外”吗?通常与这些一起,它们在运行时不会中断。
  • @LuchoMansilla - 这是因为异常发生在 InicializarModulo 任务中,并且由于它不是主线程,并且没有任何东西可以捕获它,所以没有提示您发生异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2021-04-15
相关资源
最近更新 更多