Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过程中的任务行为_C#_Asp.net Core_Task - Fatal编程技术网

C# 过程中的任务行为

C# 过程中的任务行为,c#,asp.net-core,task,C#,Asp.net Core,Task,我的代码实际上没有问题,但我可能会遇到性能问题 根据我对任务的了解,首先启动的任务(比如TaskA)可以与另一个任务(比如TaskB)并行运行,但TaskB可能会在TaskA完成其工作之前完成并退出其线程。所以在我的代码中,我试图继续一个操作,但首先要知道任务的状态。我的代码中名为TaskResult的任务将在前面的代码行运行之前完成,这是真的吗?还是我应该对其使用task.Wait(),如果这是我想要的 public virtual async Task<OperationResult

我的代码实际上没有问题,但我可能会遇到性能问题

根据我对任务的了解,首先启动的任务(比如TaskA)可以与另一个任务(比如TaskB)并行运行,但TaskB可能会在TaskA完成其工作之前完成并退出其线程。所以在我的代码中,我试图继续一个操作,但首先要知道任务的状态。我的代码中名为
TaskResult
的任务将在前面的代码行运行之前完成,这是真的吗?还是我应该对其使用
task.Wait()
,如果这是我想要的

 public virtual async Task<OperationResult> DeleteAsync(Expression<Func<TEntity, bool>> expression)
        {
            Task TaskResult = await _DbContext.Set<TEntity>().RemoveRange(IEnumerable<TEntity>);
            if (TaskResult.Status == TaskStatus.RanToCompletion)
            {
                return new OperationResult()
                {
                    Message = "",
                    ReturnObject = null,
                    Status = OperationStatus.Deleted,
                    Succeeded = true
                };
            }
            if (TaskResult.Status == TaskStatus.Faulted)
            {
                return new OperationResult()
                {
                    Message = "",
                    ReturnObject = null,
                    Status = OperationStatus.UnknownError,
                    Succeeded = false
                };
            }

        }
公共虚拟异步任务DeleteAsync(表达式) { Task TaskResult=wait _DbContext.Set().RemoveRange(IEnumerable); if(TaskResult.Status==TaskStatus.RanToCompletion) { 返回新的操作结果() { Message=“”, ReturnObject=null, 状态=操作状态。已删除, 成功=真 }; } if(TaskResult.Status==TaskStatus.Faulted) { 返回新的操作结果() { Message=“”, ReturnObject=null, 状态=操作状态。未知错误, 成功=错误 }; } }
wait关键字将停止方法的执行,直到
任务完成。完成后,
await
将返回
任务的结果,或者抛出
任务中发生的异常(如果有)。因此,如果您已经在等待一个
任务
出现故障,那么测试该任务是否出现故障是没有意义的,因为如果它出现故障,
await
将引发异常

只需将其包装在
try
/
catch
块中即可

但您的代码甚至无法编译,因为:

  • 不返回
    任务
    ,因为它实际上根本不与数据库通信。它只是删除内存中的记录。您需要请求提交您的更改
  • 实际上,您没有将对象列表传递给
    RemoveRange
    。(您是否更改了此示例的代码?)
  • 等待
    任务
    后,
    等待
    关键字返回该
    任务
    的结果,而不是
    任务
    本身
  • 下面是一个例子,说明如何编写:

    公共虚拟异步任务DeleteAsync(表达式){ _DbContext.Set().RemoveRange(somethinghere); 试一试{ //提交更改 var result=await_DbContext.SaveChangesAsync(); //结果将是一个整数(更改的记录数),而不是一个任务 //如果我们走到这一步,我们就成功了 返回新的操作结果() { Message=“”, ReturnObject=null, 状态=操作状态。已删除, 成功=真 }; }捕获(例外e){ 返回新的操作结果() { Message=“”,//如果需要,可以在此处使用e.Message ReturnObject=null, 状态=操作状态。未知错误, 成功=错误 }; } }
    请注意,您可以将:

    await _DbContext.SaveChangesAsync();
    

    如果您不打算使用
    结果

    非常感谢您的澄清。将对象传递到
    RemoveRange()
    是一个印刷错误。