抑制警告CS1998:此异步方法缺少“await”

137

我有一个接口,其中一些函数返回Task。实现该接口的某些类没有任何需要等待的内容,而其他类可能会抛出异常-因此警告是虚假和烦人的。

有没有可能抑制这些警告?例如:

public async Task<object> test()
{
    throw new NotImplementedException();
}

产生:

警告 CS1998:此异步方法缺少“await”运算符,将同步运行。 请考虑使用“await”运算符等待非阻塞API调用, 或使用“await Task.Run(...)”在后台线程上执行CPU绑定的工作。


1
当在一个被标记为async的函数中不使用新的await关键字时。 - Simon
能否给我们展示一段能重现问题的代码示例? - John Saunders
根据Jamie Marcia的回答,使用#pragma warning disable 1998可以特别回答实际提出的问题...即“是否可能抑制这些警告?” - Simon Sanderson
18个回答

0

这里有一些备选方案,取决于您的方法签名。

    public async Task Test1()
    {
        await Task.CompletedTask;
    }

    public async Task<object> Test2()
    {
        return await Task.FromResult<object>(null);
    }

    public async Task<object> Test3()
    {
        return await Task.FromException<object>(new NotImplementedException());
    }

0
如果你没有任何需要等待的东西,那么就返回 Task.FromResult。
public Task<int> Success() // note: no "async"
{
  ... // Do not have await code
  var result = ...;
  return Task.FromResult(result);
}

0

可能会出现以下 cs1998 错误。

public async Task<object> Foo()
{
    return object;
}

然后你可以进行以下改革。

public async Task<object> Foo()
{
    var result = await Task.Run(() =>
    {
        return object;
    });
    return result;
}

-1

使用抛出已产生的异常

public async Task<object> DoSomethingAsync()
{
    throw await Task.FromException<NotImplementedException>(new NotImplementedException());
}

-1
最干净的方法来抑制这个警告是在抛出异常之前使用await Task.CompletedTask;。这将作为一个无操作函数。
public async Task SomeMethod()
{
    await Task.CompletedTask;
    throw new NotImplementedException();
}

-2

从您的方法中删除异步部分。

  • 如果您返回一个任务:请使用Task.CompletedTask
  • 如果您返回一个Task< object >,请使用Task.FromResult(object)

-3
// This is to get rid of warning CS1998, please remove when implementing this method.
await new Task(() => { }).ConfigureAwait(false);
throw new NotImplementedException();

-4
您可以从该方法中删除async关键字,并让它返回Task;
    public async Task DoTask()
    {
        State = TaskStates.InProgress;
        await RunTimer();
    }

    public Task RunTimer()
    {
        return new Task(new Action(() =>
        {
            using (var t = new time.Timer(RequiredTime.Milliseconds))
            {
                t.Elapsed += ((x, y) => State = TaskStates.Completed);
                t.Start();
            }
        }));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接