我有一个async不返回任何数据的方法:
public async Task MyAsyncMethod()
{
// do some stuff async, don't return any data
}
Run Code Online (Sandbox Code Playgroud)
我从另一个返回一些数据的方法调用它:
public string GetStringData()
{
MyAsyncMethod(); // this generates a warning and swallows exceptions
return "hello world";
}
Run Code Online (Sandbox Code Playgroud)
在MyAsyncMethod()没有等待的情况下进行呼叫会导致" 因为此呼叫未被等待,当前方法在呼叫完成之前继续运行 "在visual studio中发出警告.在该警告的页面上,它指出:
只有当您确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑禁止警告.
我确定我不想等待电话完成; 我不需要或没有时间.但这一呼吁可能引发例外.
我偶然发现了这个问题几次,我确信这是一个必须有共同解决方案的常见问题.
如何在不等待结果的情况下安全地调用异步方法?
对于那些建议我等待结果的人来说,这是响应我们的Web服务(ASP.NET Web API)上的Web请求的代码.在UI上下文中等待保持UI线程空闲,但是在Web请求调用中等待将在响应请求之前等待任务完成,从而无缘无故地增加响应时间.
与此答案相关,
如果我真的想要"Fire and Forget"一个确实返回任务的方法,并且(为简单起见)让我们假设该方法不会抛出任何异常.我可以使用答案中列出的扩展方法:
public static void Forget(this Task task)
{
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,如果存在错误,则会Task引发异常,然后抛出意外异常时,异常将被吞下并被忽视.
问题:在这种情况下,扩展方法的形式是否更合适:
public static async void Forget(this Task task)
{
await task;
}
Run Code Online (Sandbox Code Playgroud)
因此编程错误会引发异常并升级(通常会导致进程失效).
在具有预期(和可忽略的)异常的方法的情况下,该方法需要变得更加精细(除此之外,关于如何构建此方法的版本的任何建议将采用可接受和可忽略的异常类型的列表? )
此代码抛出异常.是否可以定义将捕获它的应用程序全局处理程序?
string x = await DoSomethingAsync();
Run Code Online (Sandbox Code Playgroud)
使用.net 4.5/WPF
我需要生火并忘记调用一些异步方法。我意识到 VS 建议我可以将调用设置为 _discard 并且 IDE 警告消失。但是我不确定当与丢弃一起使用时是否仍然没有等待该调用。可不可能是?
public async Task<object> SomeSideTaskToBeForgotten()
{
...blah blah
}
public async Task MainTask()
{
..some stuff
_ = SomeSideTaskToBeForgotten(); //is this still fire and forget?
..some other stuff
}
Run Code Online (Sandbox Code Playgroud) 我遇到了以下有关何时何地使用的文章ConfigureAwait(false),但无法得到答案。
您不需要 ConfigureAwait(false),但仍可在库和 UI 应用程序中使用它。(例如 Xamarin、WinForms 等)
https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html
此链接说相反的答案
为所有服务器端代码调用 ConfigureAwait 的最佳实践
我的问题:
场景 1:下面的代码作为后台服务运行。
我的问题:ConfigureAwait(false)无论何时await都需要像下面的 A 和 B 一样使用:
[Service(Name = "com.MainApplicationService", Label = "Main Application Service", Exported = false)]
public class MainApplicationService : Android.App.Service
{
public override IBinder OnBind(Intent intent)
{
return null;
}
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
await InitAsync().ConfigureAwait(false); //line A
Task.Run(async () => await …Run Code Online (Sandbox Code Playgroud) c# task-parallel-library xamarin.android async-await xamarin
当被调用的方法在引用的程序集中时,编译器警告CS4014(在不等待结果的情况下调用异步方法)不会作为警告发出。
当被调用的方法在同一程序集中时,将正确发出警告。
当两个项目包含在同一解决方案中时,在Visual Studio中会发出编译器警告。
造成这种差异的原因似乎是编译器仅具有编译的引用程序集,而Visual Studio具有两个程序集的源代码。
问题是:为什么这两种行为不同?并且有什么办法可以在编译期间发出CS4014警告?
要复制此行为,请设置两个类库,每个类库都有一个代码文件:
TestClassLibrary1
public class Class1
{
public static async Task<string> DoSomething()
{
return await Task.FromResult("test");
}
}
Run Code Online (Sandbox Code Playgroud)
TestClassLibrary2(引用TestClassLibrary1)
public class Class2
{
public void CallingDoSomething()
{
Class1.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这些项目的编译将完成,而不会发出警告。在Visual Studio中的同一解决方案中打开它们将导致在错误列表中显示1条错误,并在下方显示一条红色的波浪线Class1.DoSomething()。
我正在使用monotouch/Xamarin作为iOS应用程序.
Task.Run各州的文件:
将指定的工作排队到ThreadPool上运行并返回该工作的任务句柄.
这基本上表明它可以在任何线程上运行ThreadPool.
我想做的事情如下:
Task.Run(async () => await PerformTask());
Run Code Online (Sandbox Code Playgroud)
但让它在主线程上运行.通常我会用BeginInvokeOnMainThread如下方式编写它:
BeginInvokeOnMainThread(async () => await PerformTask());
Run Code Online (Sandbox Code Playgroud)
但我在共享代码中这样做,不想使用iOS特定的调用.有没有办法让我告诉Task.Run()在主线程上调用操作?
这是场景:在我的WPF应用程序中,我希望始终保持循环运行以执行各种操作.我想到了这种模式:
void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
SomeProcessAsync(); //throw away task
}
async Task SomeProcessAsync()
{
while (true)
{
DoSomething();
await Task.Delay(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
由于返回值未使用,该调用会触发警告.沉默警告的最简洁方法是什么?
#pragma warning disable 4014
AddItemsAsync(); //throw away task
#pragma warning restore 4014
Run Code Online (Sandbox Code Playgroud)
这有效,但看起来很讨厌!
顺便说一句,我也可以使用计时器,但我喜欢这个循环的简单性.
c# ×8
async-await ×7
exception ×2
task ×2
.net ×1
asynchronous ×1
c#-7.0 ×1
ios ×1
roslyn ×1
xamarin ×1
xamarin.ios ×1