rspec/rules/S3168/csharp/rule.adoc

64 lines
1.8 KiB
Plaintext
Raw Normal View History

2021-04-28 16:49:39 +02:00
An ``++async++`` method with a ``++void++`` return type is a "fire and forget" method best reserved for event handlers because there's no way to wait for the method's execution to complete and respond accordingly. There's also no way to ``++catch++`` exceptions thrown from the method.
Having an ``++async void++`` method that is not an event handler could mean your program works some times and not others because of timing issues. Instead, ``++async++`` methods should return ``++Task++``.
This rule raises an issue when non-event handler methods are both ``++async++`` and ``++void++``.
2021-04-28 16:49:39 +02:00
== Noncompliant Code Example
----
class HttpPrinter
{
private string content;
public async void CallNetwork(string url) //Noncompliant
{
var client = new HttpClient();
var response = await client.GetAsync(url);
content = await response.Content.ReadAsStringAsync();
}
public async Task PrintContent(string url) // works correctly if web request finishes in under 1 second, otherwise content will be null
{
CallNetwork(url);
await Task.Delay(1000);
Console.Write(content);
}
}
----
2021-04-28 16:49:39 +02:00
== Compliant Solution
----
class HttpPrinter
{
private string content;
public async Task CallNetwork(string url)
{
var client = new HttpClient();
var response = await client.GetAsync(url);
content = await response.Content.ReadAsStringAsync();
}
public async Task PrintContent(string url)
{
await CallNetwork(url); // <----- call changed here. If await is not added warning CS4014 will be triggered
await Task.Delay(1000);
Console.Write(content);
}
}
----
2021-04-28 16:49:39 +02:00
== Exceptions
Event handlers, i.e. methods with two arguments, first one matching type ``++object++`` or name ``++sender++`` and the second being or inheriting from ``++EventArgs++``, are ignored.
Methods named as ``++OnSomething++`` are also ignored.