Open MaximTrushin opened 1 year ago
tip, @maximtrushin: use 3 backticks in a row around your multi-line code snippets so github formats them properly. Adding a cs
after the opening 3 backticks adds syntax colorization.
Can you include the actual emitted warning? I'm surprised that VSTHRD103 is doing this because I thought that was the job of VSTHRD002.
In any case though, there are several ContinueWith scenarios. This one seems similar to #1123.
This is the emitted warning:
[VSTHRD103] Result synchronously blocks. Use await instead.
For some reason, I can't reproduce the issue when using a small console application or library assembly. I see it happening only in bigger projects.
I still see this in version 17.11.20 and can repeat it with a small class:
namespace VSTHRD103;
public sealed class VSTHRD103
{
public static Task<Thing> CreateAsync() => Task.FromResult(new Thing());
public static Task<Thing> CreateWithNameAsync() => CreateAsync().ContinueWith(t => t.Result.EnsureNameAsync("Name"), TaskScheduler.Default).Unwrap();
}
public sealed class Thing
{
public string? Name { get; private set; }
public Task<Thing> EnsureNameAsync(string name)
{
Name = name;
return Task.FromResult(this);
}
}
Your unit test with a ContinueWith
: task.ContinueWith(t => { Console.WriteLine(t.Result); });
bails out because the method is an Action not a Func returning Task.
I don't see any code in the actual Analyzer making exemptions when called from inside a ContinueWith
VS 2022 v17.4.2:
Steps to Reproduce:
Try to compile the following code:
The assignment to r1 produces the VSTHRD103, but the assignment to r2 doesn't.
Expected Behavior: The warning must not be produced because the task is always completed when the lambda defined in ContinueWith is called.
Actual Behavior: VSTHRD103 is produced inside of ContinueWith when passing task.Result as an argument for async function.