{"id":1933,"date":"2015-05-11T19:23:47","date_gmt":"2015-05-11T19:23:46","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1933"},"modified":"2025-06-13T23:49:46","modified_gmt":"2025-06-14T06:49:46","slug":"introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/","title":{"rendered":"Apresentando o Couchbase .NET SDK 2.1.0: O cliente ass\u00edncrono do Couchbase .NET!"},"content":{"rendered":"<p>Finalmente, o Couchbase .NET SDK 2.1.0 GA est\u00e1 dispon\u00edvel! Essa vers\u00e3o \u00e9 uma vers\u00e3o secund\u00e1ria para a 2.1.0, mas inclui suporte para o padr\u00e3o de assincronia de tarefas (palavras-chave async e await) e E\/S sem bloqueio para todas as opera\u00e7\u00f5es de chave\/valor. Al\u00e9m disso, v\u00e1rios outros recursos foram inclu\u00eddos:<\/p>\n<ul>\n<li>Configura\u00e7\u00f5es TCP KEEP_ALIVE por conex\u00e3o<\/li>\n<li>Novos pontos de extens\u00e3o para a cria\u00e7\u00e3o de transcodificadores, serializadores e conversores \"plug\u00e1veis\"<\/li>\n<li>Suporte para \"Get and Touch\" para expira\u00e7\u00f5es deslizantes em pares de chave\/valor<\/li>\n<li>Suporte oficial para um m\u00e9todo \"a chave existe\"<\/li>\n<\/ul>\n<p>Outros aprimoramentos e corre\u00e7\u00f5es de bugs incluem uma corre\u00e7\u00e3o para leituras de r\u00e9plicas, um novo mecanismo de solicita\u00e7\u00e3o de consulta para lidar com inconsist\u00eancias e erros durante cen\u00e1rios de troca\/rebalanceamento\/failover e uma infinidade de outras corre\u00e7\u00f5es de bugs e aprimoramentos (mais de 45 t\u00edquetes Jira fechados). Esta vers\u00e3o \u00e9 JUGGED!<\/p>\n<p>Nas pr\u00f3ximas se\u00e7\u00f5es, abordarei brevemente os principais recursos desta vers\u00e3o; aguarde postagens mais longas em um futuro pr\u00f3ximo que se aprofundem em cada recurso.<\/p>\n<h2>Suporte ao padr\u00e3o de assincronia de tarefas para K\/V<\/h2>\n<p>Todo o mecanismo de E\/S foi reformulado nesta vers\u00e3o para oferecer suporte a E\/S sem bloqueio; para aproveitar esse recurso, n\u00f3s o expusemos por meio das palavras-chave async e await. Se voc\u00ea n\u00e3o estiver familiarizado com as palavras-chave async\/await e com o TAP (Task Asynchrony Pattern, padr\u00e3o de assincronia de tarefas), talvez queira dar um pulo l\u00e1 e ler <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/hh191443%28v=vs.110%29.aspx\">este<\/a>ou <a href=\"https:\/\/blogs.msdn.com\/b\/dotnet\/archive\/2012\/04\/03\/async-in-4-5-worth-the-await.aspx\">este<\/a>ou <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/hh156528.aspx\">este<\/a> antes de continuar.<\/p>\n<p>Sem entrar em muitos detalhes (haver\u00e1 um mergulho profundo em outro post futuro), aqui est\u00e1 um exemplo de uso do async\/await e do SDK do Couchbase para inserir e recuperar uma chave de um cluster do Couchbase:<\/p>\n<p><script src=\"https:\/\/gist.github.com\/jeffrymorris\/417dbe9ff0f1b001c464.js\"><\/script><\/p>\n<p>A primeira diferen\u00e7a que voc\u00ea notar\u00e1 \u00e9 que a assinatura do m\u00e9todo agora tem a palavra-chave async adicionada a ele; isso possibilitar\u00e1 o uso da palavra-chave await no corpo do m\u00e9todo. Quando o m\u00e9todo for executado, ele ser\u00e1 executado de forma s\u00edncrona at\u00e9 chegar \u00e0 palavra-chave await e, em seguida, ser\u00e1 \"retirado\" e executado de forma ass\u00edncrona. H\u00e1 um pouco de m\u00e1gica de compilador envolvida aqui no lado do .NET, mas isso \u00e9 tudo o que voc\u00ea precisa fazer para escrever c\u00f3digo ass\u00edncrono usando o SDK do Couchbase .NET!<\/p>\n<p>No SDK do Couchbase .NET, uma tarefa ser\u00e1 criada e armazenada na fila; a solicita\u00e7\u00e3o ser\u00e1 disparada para o servidor do Couchbase de maneira \"dispare e esque\u00e7a\" (via IOCP) e, quando for conclu\u00edda, ser\u00e1 disparado um retorno de chamada que concluir\u00e1 a solicita\u00e7\u00e3o lendo a resposta e retornando-a ao chamador. Se ocorrer um erro ou exce\u00e7\u00e3o, ele ser\u00e1 tratado e retornado como a implementa\u00e7\u00e3o IOperationResult que a tarefa encapsula. Mais uma vez, aguarde um aprofundamento em um post futuro!<\/p>\n<h2>Novos pontos de extens\u00e3o!<\/h2>\n<p>Um dos objetivos do SDK 2.0 era fornecer pontos de extens\u00e3o para os v\u00e1rios componentes do SDK; se voc\u00ea n\u00e3o gostar da nossa implementa\u00e7\u00e3o ou da API externa na qual ela se baseia, escreva a sua pr\u00f3pria! Outro efeito positivo colateral \u00e9 que isso facilita o isolamento e o teste de v\u00e1rias camadas e componentes dentro do SDK.<\/p>\n<p>Na vers\u00e3o 2.1.1, agora oferecemos suporte a tr\u00eas novos pontos de extens\u00e3o:<\/p>\n<ol>\n<li><b>Serializadores<\/b> - manipulam a serializa\u00e7\u00e3o e a desserializa\u00e7\u00e3o de POCOs para JSON.<\/li>\n<li><b>Conversores<\/b> - lidar com a convers\u00e3o dos pacotes de bytes do Memcached que v\u00e3o e voltam do servidor Couchbase (e a paridade entre os outros SDKs)<\/li>\n<li><b>Transcodificadores<\/b> - manipulam a convers\u00e3o e a serializa\u00e7\u00e3o\/desserializa\u00e7\u00e3o do corpo da solicita\u00e7\u00e3o ou da resposta (a parte \"valor\" de \"chave\/valor\").<\/li>\n<\/ol>\n<p>Para criar um serializador personalizado, implemente a interface ITypeSerializer e forne\u00e7a um Func<itypeserializer> como m\u00e9todo de f\u00e1brica para criar o serializador para a ClientConfiguration. Um exemplo de um serializador personalizado seria se voc\u00ea quisesse usar outra API de serializa\u00e7\u00e3o JSON (talvez <a href=\"https:\/\/github.com\/ServiceStack\/ServiceStack.Text\">ServiceStack.Text?<\/a>) que n\u00e3o seja a API JSON.NET padr\u00e3o que o SDK usa por padr\u00e3o. <\/itypeserializer><\/p>\n<p>Conversores e transcodificadores personalizados tamb\u00e9m podem ser conectados, implementando as interfaces ITypeConverter ou ITypeTranscoder e fornecendo uma classe personalizada que lide com seu caso de uso ou necessidade espec\u00edfica. Da mesma forma que os serializadores, voc\u00ea fornece uma classe Func<itypetranscoder> ou Func<itypeconverter> para \"injetar\" o novo comportamento no cliente. <\/itypeconverter><\/itypetranscoder><\/p>\n<p>Aguarde postagens futuras que se aprofundem nesses pontos de extens\u00e3o e ilustrem como seria poss\u00edvel criar e injetar um novo comportamento de transcodificador, serializador e\/ou conversor no cliente.<\/p>\n<h2>Outros recursos novos na vers\u00e3o 2.1.0<\/h2>\n<h3>Configura\u00e7\u00f5es por conex\u00e3o para TCP KEEP-ALIVES<\/h3>\n<p>A configura\u00e7\u00e3o padr\u00e3o do sistema operacional para TCP KEEP-ALIVES no Windows \u00e9 de 120 minutos. Em alguns casos, como implanta\u00e7\u00f5es em nuvem em que os dispositivos de rede (balanceadores de carga etc.) foram configurados para eliminar conex\u00f5es TCP que ficaram ociosas por um per\u00edodo mais curto, precisamos de uma maneira de definir o TCP KEEP-ALIVES padr\u00e3o para um per\u00edodo de tempo menor. \u00c9 poss\u00edvel fazer isso globalmente no n\u00edvel do sistema operacional por meio das configura\u00e7\u00f5es do Registro via KeepAliveInterval e KeepAliveTime; no entanto, isso afetar\u00e1 todos os aplicativos em execu\u00e7\u00e3o nesse servidor. Uma solu\u00e7\u00e3o melhor \u00e9 alterar o intervalo e o tempo no n\u00edvel da conex\u00e3o TCP para que ele se aplique somente \u00e0s conex\u00f5es que o cliente est\u00e1 usando.<\/p>\n<p>Agora \u00e9 poss\u00edvel fazer isso por meio das propriedades EnableTcpKeepAlives, TcpKeepAliveTime e TcpKeepAliveInterval da classe ClientConfiguration. EnableTcpKeepAlives ativar\u00e1 ou desativar\u00e1 o TCP KEEP-ALIVES (o padr\u00e3o \u00e9 ativado), TcpKeepAliveTime \u00e9 o tempo que transcorrer\u00e1 antes que os KEEP-ALIVES sejam enviados e TcpKeepAliveInterval \u00e9 o intervalo entre os KEEP-ALIVES depois que o TcpKeepAliveTime for atingido.<\/p>\n<p><script src=\"https:\/\/gist.github.com\/jeffrymorris\/c723eba945af48265081.js\"><\/script><\/p>\n<p>No exemplo acima, antes de criar o objeto Cluster e abrir um bucket a partir dele, criamos uma ClientConfiguration e definimos EnableTcpKeepAlives como true (observe que o padr\u00e3o \u00e9 true, portanto, isso \u00e9 apenas para ilustra\u00e7\u00e3o), o TcpKeepAliveTime \u00e9 definido como 1hr (\u00e9 quando o primeiro pacote KEEP-ALIVE ser\u00e1 enviado se a conex\u00e3o estiver ociosa) e, por fim, definimos o TcpKeepAliveInterVal como 5secs. Isso significa que, ap\u00f3s 1 hora de inatividade, o cliente come\u00e7ar\u00e1 a enviar TCP KEEP-ALIVES a cada 5 segundos at\u00e9 que a conex\u00e3o se torne ativa novamente.<\/p>\n<h3>Suporte ao m\u00e9todo Exists<\/h3>\n<p>Os usu\u00e1rios frequentemente pedem uma maneira de verificar se uma chave existe sem realmente recuperar o valor. Agora temos esse suporte na vers\u00e3o 2.1.0. H\u00e1 suporte para as vers\u00f5es s\u00edncrona e ass\u00edncrona desse m\u00e9todo.<\/p>\n<h3>Suporte para GAT (Get and Touch) e Touch (para expira\u00e7\u00f5es deslizantes)<\/h3>\n<p>Dois novos m\u00e9todos foram introduzidos: GetAndTouch e Touch. GetAndTouch recuperar\u00e1 um valor e atualizar\u00e1 sua expira\u00e7\u00e3o e Touch atualizar\u00e1 a expira\u00e7\u00e3o de uma chave, mas n\u00e3o retornar\u00e1 nenhum valor.<\/p>\n<h2>Corre\u00e7\u00f5es de erros importantes<\/h2>\n<ul>\n<li>Transcodifica\u00e7\u00e3o de n\u00fameros inteiros de 1.3.X para 2.X<\/li>\n<li>Corre\u00e7\u00f5es para leituras de r\u00e9plicas<\/li>\n<li>Muitas e muitas corre\u00e7\u00f5es de bugs e melhorias!<\/li>\n<\/ul>\n<h2>Como obter o SDK do Couchbase .NET<\/h2>\n<p>O SDK est\u00e1 dispon\u00edvel para download diretamente, por meio do NuGet, ou clonando e extraindo o reposit\u00f3rio do Github:<\/p>\n<ul>\n<li>Fa\u00e7a o download dos bin\u00e1rios <a href=\"https:\/\/packages.couchbase.com.s3.amazonaws.com\/clients\/net\/2.1\/Couchbase-Net-Client-2.1.0.zip\">aqui<\/a>.<\/li>\n<li>O pacote NuGet pode ser encontrado <a href=\"https:\/\/www.nuget.org\/packages\/CouchbaseNetClient\/\">aqui<\/a>.<\/li>\n<li>O reposit\u00f3rio do Github \u00e9 <a href=\"https:\/\/github.com\/couchbase\/couchbase-net-client\">aqui<\/a>.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>At long last the Couchbase .NET SDK 2.1.0 GA is available! This release is a minor release for 2.1.0, but it includes support for the Task Asynchrony Pattern (async and await keywords) and non-blocking IO for all Key\/Value operations. In [&hellip;]<\/p>","protected":false},"author":21,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,2201],"tags":[1437,1439],"ppma_author":[8970],"class_list":["post-1933","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-tools-sdks","tag-async","tag-asynchronous"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client! - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client!\" \/>\n<meta property=\"og:description\" content=\"At long last the Couchbase .NET SDK 2.1.0 GA is available! This release is a minor release for 2.1.0, but it includes support for the Task Asynchrony Pattern (async and await keywords) and non-blocking IO for all Key\/Value operations. In [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-05-11T19:23:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:49:46+00:00\" \/>\n<meta name=\"author\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jeffrysmorris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client!\",\"datePublished\":\"2015-05-11T19:23:46+00:00\",\"dateModified\":\"2025-06-14T06:49:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/\"},\"wordCount\":1093,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"async\",\"asynchronous\"],\"articleSection\":[\".NET\",\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/\",\"name\":\"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client! - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-05-11T19:23:46+00:00\",\"dateModified\":\"2025-06-14T06:49:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\",\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"caption\":\"Jeff Morris, Senior Software Engineer, Couchbase\"},\"description\":\"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).\",\"sameAs\":[\"https:\/\/x.com\/jeffrysmorris\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/jeff-morris\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client! - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/","og_locale":"pt_BR","og_type":"article","og_title":"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client!","og_description":"At long last the Couchbase .NET SDK 2.1.0 GA is available! This release is a minor release for 2.1.0, but it includes support for the Task Asynchrony Pattern (async and await keywords) and non-blocking IO for all Key\/Value operations. In [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-05-11T19:23:46+00:00","article_modified_time":"2025-06-14T06:49:46+00:00","author":"Jeff Morris, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@jeffrysmorris","twitter_misc":{"Written by":"Jeff Morris, Senior Software Engineer, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client!","datePublished":"2015-05-11T19:23:46+00:00","dateModified":"2025-06-14T06:49:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/"},"wordCount":1093,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["async","asynchronous"],"articleSection":[".NET","Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/","url":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/","name":"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client! - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-05-11T19:23:46+00:00","dateModified":"2025-06-14T06:49:46+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-2-1-0-the-asynchronous-couchbase-net-client\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing Couchbase .NET SDK 2.1.0: The asynchronous Couchbase .NET Client!"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341","name":"Jeff Morris, engenheiro de software s\u00eanior, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812","url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","caption":"Jeff Morris, Senior Software Engineer, Couchbase"},"description":"Jeff Morris \u00e9 engenheiro de software s\u00eanior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff \u00e9 respons\u00e1vel pelo desenvolvimento dos SDKs do Couchbase e pela integra\u00e7\u00e3o com o N1QL (linguagem de consulta).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/jeff-morris\/"}]}},"authors":[{"term_id":8970,"user_id":21,"is_guest":0,"slug":"jeff-morris","display_name":"Jeff Morris, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","first_name":"Jeff","last_name":"Jeff Morris, Senior Software Engineer, Couchbase","user_url":"","author_category":"","description":"Jeff Morris \u00e9 engenheiro de software s\u00eanior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff \u00e9 respons\u00e1vel pelo desenvolvimento dos SDKs do Couchbase e pela integra\u00e7\u00e3o com o N1QL (linguagem de consulta)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1933","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1933"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1933\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1933"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1933"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1933"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}