Tag: async await

SmtpClient.SendMailAsync方法是否安全线程?

SmtpClient类声明实例成员不是线程安全的。 如果对Send或SendAsync进行并发调用,则可以看到这一点。 如果第一个尚未完成,则两个方法都会在第二次调用时抛出InvalidOperationException。 .NET 4.5中引入的方法SendMailAsync不会将InvalidOperationException列为抛出exception。 新的.NET 4.5方法是否实现某种排队? Reflector无法阐明这个类的实现细节,所以我假设这已经在本机方法中实现了。 多个线程可以安全地调用SMTP客户端的共享实例上的SendMessageAsync方法吗?

是否可以声明异步方法为返回void以使CS4014警告静音?

Visual Studio会发出此代码的警告(’因为不等待此调用,在调用完成之前会继续执行当前方法’)。 static void Main(string[] args) { FireAndForget(); // <– Warning CS4014 // Do something else. } static async Task FireAndForget() { // Do something (cannot throw). } 我的理解是,在这种特殊情况下不等待任务是可以的,因为FireAndForget永远不会抛出exception。 我没有考虑使用pragma禁用警告,而是考虑将FireAndForget的返回类型从Task更改为void。 这有效地使编译器沉默。 static async void FireAndForget() // <– Task changed to void { // Do something (cannot throw). } 但是,根据Stephen Cleary的说法,应该避免使用“async void”方法,所以我不太清楚该怎么做。 如果方法不是设计为首先等待并且没有抛出exception,那么是否可以使用’async void’方法?

如何使用异步调用的结果来水合词典?

假设我的代码如下所示: public async Task DoSomethingReturnString(int n) { … } int[] numbers = new int[] { 1, 2 , 3}; 假设我想创建一个字典,其中包含为每个与此类似的数字调用DoSomethingReturnString的结果: Dictionary dictionary = numbers.ToDictionary(n => n, n => DoSomethingReturnString(n)); 这不起作用,因为DoSomethingReturnString返回Task而不是string 。 intellisense建议我尝试将我的lambda表达式指定为异步,但这似乎也没有解决问题。

Log4net LogicalThreadContext未按预期工作

我一直在尝试使用Log4nets LogicalThreadContext为我的每个日志条目提供上下文。 我的应用程序非常重视async / await,但是从阅读各种文章开始,LogicalThreadContext应该可以与.NET 4.5以后的异步代码一起正常工作。 我正在使用.NET 4.5.1和log4net 2.0.3 我找到了Stephen Cleary关于日志记录和.NET CallContext的一篇很棒的文章 ,结果我决定采用他的代码并使其适应使用log4net,试图查看我的代码中是否有错误可能有一直在引发这个问题。 首先,我完全按原样运行Stephens代码并得到预期的输出 Main 1: Main 1 A: Main 2: Main 2 A: Main 1 A: Main 1 B: Main 2 A: Main 2 B: Main 2 B: Main 2: Main 1 B: Main 1: 接下来,我修改了代码以使用log4net而不是Stephens自定义MyStack internal class Program { private static readonly ILog […]

立即从异步方法投掷

从async Task方法抛出的exception的正常行为是保持hibernate状态,直到稍后观察它们,或者直到任务被垃圾收集。 我可以想到我可能想立即抛出的情况。 这是一个例子: public static async Task TestExAsync(string filename) { // the file is missing, but it may be there again // when the exception gets observed 5 seconds later, // hard to debug if (!System.IO.File.Exists(filename)) throw new System.IO.FileNotFoundException(filename); await Task.Delay(1000); } public static void Main() { var task = TestExAsync(“filename”); try { Thread.Sleep(5000); […]

当涉及到可变值类型时,如何处理async / await产生的副作用?

请考虑以下示例代码: using System.Diagnostics; using System.Threading.Tasks; public struct AStruct { public int Value; public async Task SetValueAsync() { Value = await Task.Run(() => 1); } public void SetValue() { Value = 1; } } class Program { static void Main(string[] args) { Test(new AStruct()); TestAsync(new AStruct()).Wait(); } private static async Task TestAsync(AStruct x) { Debug.Assert(x.Value == […]

我的异步任务总是阻止UI

在WPF 4.5应用程序中,我不明白为什么在使用await + a task时UI被阻止: private async void Button_Click(object sender, RoutedEventArgs e) { // Task.Delay works great //await Task.Delay(5000); double value = await JobAsync(25.0); MessageBox.Show(“finished : ” + value.ToString()); } private async Task JobAsync(double value) { for (int i = 0; i < 30000000; i++) value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); return value; } await Task.Delay运行良好,但等待JobAsync阻止UI。 为什么? […]

IAsyncCursor如何用于使用mongodb c#驱动程序进行迭代?

我正在尝试获取服务器中所有数据库的列表,并最终将它们打印出来(即将它们的名称用作string s)。 使用以前版本的c#驱动程序,我可以调用Server.GetDatabases() ,但它已被ListDatabasesAsync()替换。 返回值是IAsyncCursor ,我不知道如何处理它。 如何用这样的游标遍历数据库列表(或任何东西)?

查找无休止的异步方法调用

在将ASP.NET应用程序迁移到async / await模型时,我偶然发现了一个相当危险的情况。 情况是我创建了一个async方法: async Task DoWhateverAsync() ,将接口中的声明更改为Task DoWhateverAsync()并希望编译器通过该警告告诉我代码现在在哪里出错。 好吧,运气不好。 只要通过接口注入该对象,就不会发出警告。 🙁 这很危险。 有没有办法自动检查返回任务的非等待方法? 我不介意一些警告太多,但我不想错过一个。 这是一个例子: using System.Threading.Tasks; namespace AsyncAwaitGames { // In my real case, that method just returns Task. public interface ICallee { Task DoSomethingAsync(); } public class Callee: ICallee { public async Task DoSomethingAsync() => await Task.FromResult(0); } public class Caller { […]

如何构建一个任务而不启动它?

我想使用这个Task 构造函数 。 我似乎无法得到正确的sntax可以有人纠正我的代码。 另外,我是否正确地认为如果以这种方式构建任务,它是不是已经开始了? 我认为我需要的构造函数: Task(Func, Object) 我的代码错误: 参数1:无法从’方法组’转换为’ System.Func ‘ static void Main(string[] args) { var t = new Task(GetIntAsync, “3”); //error is on this line … } static async Task GetIntAsync(string callerThreadId) { … return someInt; }