Tag: async await

一个代码示例说明了async / await和Reactive(Rx)扩展的范例之间的区别?

两个系统。 .NET的react native扩展和新的C#5.0(.NET 4.5) async/await追求(或基于) future和promises构造范式(方法)。 你能给出(*)最简单的C#代码示例来说明它们之间的区别吗? (*) 没有I / O,互联网或数据库连接是否可能? 更新: 好吧,如果以前似乎回答了这个问题,让我重新制定一下。 为什么在使用本机.NET Iobservable / IObserver + await / async时会添加并开始使用.NET的Reactive(Rx)扩展? 有什么可能的例子说明Rx会在没有Rx的情况下做出同样更笨拙或效率更低的东西(即只使用原生的.NET Iobservable / IObserver + await / async方法)?

异步调用时,Azure KeyVault Active Directory AcquireTokenAsync超时

我按照Microsoft的Hello Key Vault示例应用程序中的示例在我的ASP.Net MVC Web应用程序上设置了Azure Keyvault。 Azure KeyVault(Active Directory)AuthenticationResult默认情况下有一个小时到期。 因此,一小时后,您必须获得一个新的身份validation令牌。 在获得我的第一个AuthenticationResult令牌后,KeyVault正在按预期工作,但在1小时到期后,它无法获得新令牌。 不幸的是,我的生产环境失败让我意识到这一点,因为我从未测试过去一小时的开发。 无论如何,经过两天多的努力弄清楚我的keyvault代码出了什么问题,我提出了一个解决方案来修复我的所有问题 – 删除异步代码 – 但感觉非常hacky。 我想找出为什么它首先不起作用。 我的代码如下所示: public AzureEncryptionProvider() //class constructor { _keyVaultClient = new KeyVaultClient(GetAccessToken); _keyBundle = _keyVaultClient .GetKeyAsync(_keyVaultUrl, _keyVaultEncryptionKeyName) .GetAwaiter().GetResult(); } private static readonly string _keyVaultAuthClientId = ConfigurationManager.AppSettings[“KeyVaultAuthClientId”]; private static readonly string _keyVaultAuthClientSecret = ConfigurationManager.AppSettings[“KeyVaultAuthClientSecret”]; private static readonly string _keyVaultEncryptionKeyName = […]

Task .Convert 扩展方法是否有用或是否存在隐患?

我正在为Google Cloud API编写客户端库,这些库具有相当常见的异步辅助重载模式: 做一些简短的同步工作来设置请求 发出异步请求 以简单的方式转换结果 目前我们正在使用异步方法,但是: 转换await的结果最终会在优先级方面令人讨厌 – 我们最终需要(await foo.Bar().ConfigureAwait(false)).TransformToBaz()和括号很烦人。 使用两个语句可以提高可读性,但这意味着我们不能使用表达式身体方法。 我们偶尔会忘记ConfigureAwait(false) – 这在某种程度上可以通过工具解决,但它仍然有点嗅觉 Task.ContinueWith听起来好主意,但我读过斯蒂芬克莱里的博客文章推荐反对它,原因似乎是合理的。 我们正在考虑为Task添加一个扩展方法,如下所示: 潜在的延伸方法 public static async Task Convert( this Task task, Func projection) { var result = await task.ConfigureAwait(false); return projection(result); } 然后我们可以非常简单地从同步方法中调用它,例如 public async Task BarAsync() { var fooRequest = BuildFooRequest(); return FooAsync(fooRequest).Convert(foo => new Bar(foo)); } 甚至: public […]

C#async / await有/无等待(火灾和忘记)

我有以下代码: static async Task Callee() { await Task.Delay(1000); } static async Task Caller() { Callee(); // #1 fire and forget await Callee(); // #2 >1s Task.Run(() => Callee()); // #3 fire and forget await Task.Run(() => Callee()); // #4 >1s Task.Run(async () => await Callee()); // #5 fire and forget await Task.Run(async () => await […]

等待运算符出错

我的代码有问题。 我怎么解决这个问题? 等待运算符中存在此问题。 public MyModel() { HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync(“https://api.vkontakte.ru/method/video.get?uid=219171498&access_token=d61b93dfded2a37dfcfa63779efdb149653292636cac442e53dae9ba6a049a75637143e318cc79e826149”); string googleSearchText = await response.Content.ReadAsStringAsync(); JObject googleSearch = JObject.Parse(googleSearchText); IList results = googleSearch[“response”].Children().Skip(1).ToList(); IList searchResults = new List(); foreach (JToken result in results) { MainPage1 searchResult = JsonConvert.DeserializeObject(result.ToString()); searchResults.Add(searchResult); }

Await / async无法按预期工作

我开始使用async / await了。 我使用基于MVVM模式的WPF编写了简单的应用程序,但它没有像我预期的那样工作。 该程序的工作原理是没有异步函数:执行执行函数后,只有在循环函数结束后才会冻结和解冻。 请告诉我哪些部分我弄错了。 我很感激任何反馈。 🙂 这是我的modelview类。 它inheritance自wpf类,它包含标准wpf函数的定义,如OnPropertyChanged。 public class ModelView : wpf { string _state; public string state { get { return _state; } set { _state = value; OnPropertyChanged(“state”); } } public DelegateCommand work { get; set; } public ModelView() { state = “Program started”; work=new DelegateCommand(_work); } async void _work(object […]

有关异步编程与异步和等待的问题c#

我正在学习如何使用Async和Await c#。 所以我有一个链接http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx#BKMK_WhatHappensUnderstandinganAsyncMethod 从这里我尝试从VS2012 IDE运行代码,但收到错误。 此function引发错误。 private void button1_Click(object sender, EventArgs e) { int contentLength = await AccessTheWebAsync(); label1.Text= String.Format(“\r\nLength of the downloaded string: {0}.\r\n”, contentLength); } 此行给出错误await AccessTheWebAsync(); ‘await’运算符只能在异步方法中使用。 考虑使用’async’修饰符标记此方法并将其返回类型更改为’Task’ 我做错了什么。 请指导我如何运行代码。 谢谢

处理异步时TcpClient vs Socket

这不是另一个TcpClient vs Socket。 TcpClient是Socket类的一个包装器,用于简化开发,同时也暴露了底层的Socket。 还是…… 在TcpClient类的MSDN库页面上,可以阅读以下注释: TcpClient类提供了在同步阻塞模式下通过网络连接,发送和接收流数据的简单方法。 而对于Socket类: Socket类允许您使用ProtocolType枚举中列出的任何通信协议执行同步和异步数据传输。 要仅通过TcpCient异步发送/接收某些数据,必须调用GetStream,以便通过在TAP模式上调用ReadAsync和WriteAsync方法来异步读取/写入数据的基础NetworkStream。 (可能使用async / await构造)。 要通过Socket异步发送/接收一些数据(我不是专家,但我认为我做对了),我们可以通过调用BeginRead / EndRead BeginWrite / EndWrite(或者只是ReadAsync或者)来直接读取/写入套接字实例本身。 WriteAsync ..不暴露TAP模式 – 即不返回任务..令人困惑)。 首先,任何想法为什么.NET 4.5中的Socket类没有以任何方式实现TAP模式,即ReadAsync和WriteAsync返回Task(如果调用不同的事件以保留向后compat)? 无论如何,很容易从APM模型方法对构建一个Task方法,所以让我说我调用这个异步方法(用于读取)ReadAsyncTAP(返回一个Task)。 好 ? 所以现在让我说我想编写一个客户端方法async Task ReadNbBytes(int nbBytes) ,我将从我的代码调用异步从网络读取一定数量的字节。 完全基于TcpClient的此方法的实现将通过调用GetStream来获取NetworkStream,并且将包含等待ReadAsync调用的异步循环,直到缓冲区满。 基于Socket的这种方法的实现将包含一个等待ReadAsyncTAP的异步循环,直到缓冲区满。 在一天结束时,从客户端代码的角度来看,我认为它没有任何区别。 在这两种情况下, await ReadNbBytes的调用将立即“返回”。 但是,我认为它在幕后产生了影响……对于TcpClient,依赖于NetworkStream,与直接使用套接字相比,读取是否会在某种程度上阻塞或不阻止? 如果没有,那么在谈论同步阻塞模式时,TcpClient的注释是错误的吗? 如果有人能澄清,将非常感激! 谢谢。

无法从视图中的异步方法返回值

我试图从async html助手返回值,但它给出了以下字符串而不是所需的值。 “System.Threading.Tasks.Task + WhenAllPromise`1 [System.Decimal]” 方法: public async static Task CalculateCurrency(this HtmlHelper helper, decimal amount, string from, string country) { if (await getValue(country)) { string fromCurrency = string.IsNullOrEmpty(from) ? “USD” : from; string toCurrency = country; WebClient client = new WebClient(); string url = string.Format(“http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X”, fromCurrency.ToUpperInvariant(), toCurrency.ToUpperInvariant()); Stream response = await client.OpenReadTaskAsync(url); StreamReader reader […]

来自Web UI的死锁.Result

我正在阅读以下主题http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html 并决定在我的库中编写一个通用的实用方法,通过HTTPClient对远程URL进行GET public static async Task GetAsync(HttpGetObject getObject) { string baseUrl = getObject.BaseUrl; string actionUrl = getObject.ActionRelativeUrl; string acceptType = getObject.AcceptType; using (var client = new HttpClient()) { client.BaseAddress = new Uri(baseUrl); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(acceptType)); AddCustomHeadersToHttpClient(client, getObject); // HTTP GET HttpResponseMessage httpResponseMessage = await client.GetAsync(actionUrl).ConfigureAwait(false); if (httpResponseMessage.IsSuccessStatusCode) { T response = await httpResponseMessage.Content.ReadAsAsync().ConfigureAwait(false); return response; […]