Tag: async await

使用TcpListener进行异步/等待或开始/结束?

我已经开始构建一个tcp服务器,它将能够接受许多客户端,并同时从所有客户端接收新数据。 到目前为止,我使用IOCP用于tcp服务器,这非常简单和舒适,但这次我想使用Async / Await技术。 那是在C#5.0中发布的。 问题是,当我开始使用async / await编写服务器时,我发现在tcp中有多个用户服务器用例,async / await tech。 并且常规同步方法将起作用。 这是一个更具体的简单示例: class Server { private TcpListener _tcpListener; private List _clients; private bool IsStarted; public Server(int port) { _tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, port)); _clients = new List(); IsStarted = false; } public void Start() { IsStarted = true; _tcpListener.Start(); Task.Run(() => StartAcceptClientsAsync()); } […]

在示例代码中是否需要Task.WhenAll?

在下面的代码中,task1和task2彼此独立,可以并行运行。 以下两个实现有什么区别? var task1 = GetList1Async(); var task2 = GetList2Async(); await Task.WhenAll(task1, task2); var result1 = await task1; var result2 = await task2; 和 var task1 = GetList1Async(); var task2 = GetList2Async(); var result1 = await task1; var result2 = await task2; 为什么我要选择一个而不是另一个? 编辑:我想补充一点,返回类型的GetList1Async()和GetList2Async()方法是不同的。

重型I / O操作中的Parallel.ForEach与Async Forloop

我想比较两种理论情景。 为了这个问题,我简化了案件。 但基本上它是典型的生产者消费者情景。 (我专注于消费者)。 我有一个大的Queue dataQueue ,我必须传输给多个客户端。 所以让我们从更简单的情况开始: class SequentialBlockingCase { public static Queue DataQueue = new Queue(); private static List _destinations = new List(); /// /// Is the main function that is run in its own thread /// private static void Run() { while (true) { if (DataQueue.Count > 0) { string data = […]

.NET HTTPClient异步限制

我有一个小的.Net 4.5 C#应用程序,它从数据源读取信息,然后将此信息推送到一个带有简单控制器的.NET 4.5 Web API站点的网站。 控制器接收数据并将其放入数据库。 以下适用于我,只要应用程序可以读取它就可以写入并且所有内容都在DB中结束: public static void PostDataToWebApi(MyDataClass tData) { HttpResponseMessage s = null; try { s = client.PostAsJsonAsync(“/api/Station/Collector”, tData).Result; s.EnsureSuccessStatusCode(); } catch (Exception e) { Console.WriteLine(“ERROR (ClientPost): ” + e.ToString()); } } 以下不起作用。 它发布了大约一千多条记录,然后在“任务被取消”的消息中出现了一些错误,但是大约10秒后它恢复处理: public static async void PostDataToWebApi(MyDataClass tData) { HttpResponseMessage s = null; try { s = await […]

单向异步/等待WCF中的调用

我有一个传统的WCF服务,其中包含以最经典的方式实现的许多单向操作合同: // The interface [OperationContract(IsOneWay = true, AsyncPattern = true)] IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState); void EndFinalizePublishing(IAsyncResult result); // The service public IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState) {…} 所以一切正常,现在我需要将其转换为c#5最新的async / await模式。 注意操作的单向性。 我的问题: 我想我需要从OperationContract属性中删除AsyncPattern = true 。 将IAsyncResult返回类型替换为接口中的void和类中的async void 。 为方便起见,删除开始/结束并添加Async后缀。 现在我该如何从客户端调用单向操作? 对于单向呼叫,在客户端右侧没有使用async / await? 这是正确的,将导致客户端的真正异步处理。 // The proxy public void […]

在直接从调用另一个库返回任务的库中使用ConfigureAwait(false)是否有利?

这个问题的后续行动。 我有一个包含许多异步方法的库,可以轻量地包装HttpClient 。 实际上他们只是做了一些设置并直接返回从HttpClient调用返回的Task : public Task DoThingAsyc() { // do some setup return httpClient.DoThingAsync(); } 我在考虑是否将ConfigureAwait(false)添加到这些调用中。 流行的智慧似乎是“是的,总是在图书馆那样做”。 但在这种情况下,它会引入一些(可能是可忽略的)开销,因为ConfigureAwait返回一个ConfiguredTaskAwaitable ,需要将其包装回Task中,以便不更改方法签名。 当然不难编码: public async Task DoThingAsyc() { // do some setup return await httpClient.DoThingAsync().ConfigureAwait(false); } 我的问题是, ConfigureAwait(false)的效率优势是否可能超过此案例中引入的额外开销? 以上哪个例子被认为是更好的做法?

有没有办法同步运行异步lambda?

有没有办法同步运行异步lambda? 不允许修改lambda表达式,它必须按原样保留。 复制/粘贴示例(这是一个抽象): var loopCnt = 1000000; Action<List> aslambda = async (l) => { Thread.Sleep(100); await Task.Run(() => { }); for (int i = 0; i < loopCnt; i++) { l.Add(i); } }; var lst = new List(); aslambda(lst); //This runs asynchronously if (lst.Count < loopCnt-100) { ; } 解: 接受一个答案对我来说真是一个两难的选择。 我已经尝试过使用NuGet软件包的Stephen Cleary的解决方案 – 工作精彩且广泛适用,但是dvorn对问题(因为它的制定;))的回答要容易得多。 […]

如何正确地重新抛出已经处于故障状态的任务的exception?

我有一个同步方法,除其他外,它检查待处理任务的状态并重新抛出其exception,如果有的话: void Test(Task task) { // … if (task.IsFaulted) throw task.Exception; // … } 这不会传播exception堆栈跟踪信息,并且对调试器不友好。 现在,如果Test是async ,它将不会像这样简单和自然: async Task Test(Task task) { // … if (task.IsFaulted) await task; // rethrow immediately and correctly // … } 问题:如何正确执行同步方法? 我想出了这个,但我不喜欢它: void Test(Task task) { // … if (task.IsFaulted) new Action(async () => await task)(); // … }

实现返回Task的方法时的合同协议

在实现返回关于抛出exception的Task的方法时,是否存在MS“最佳实践”或合同协议? 这是在编写unit testing时出现的,我试图弄清楚我是否应该测试/处理这种情况(我认识到答案可能是“防御性编码”,但我不希望这是答案)。 即 方法必须始终返回一个Task,该Task应包含抛出的Exception。 方法必须始终返回一个Task,除非该方法提供无效参数(即ArgumentException)。 方法必须总是返回一个任务,除非开发人员变得流氓并做他/她想要的事情(jk)。 Task Foo1Async(string id){ if(id == null){ throw new ArgumentNullException(); } // do stuff } Task Foo2Async(string id){ if(id == null){ var source = new TaskCompletionSource(); source.SetException(new ArgumentNullException()); return source.Task; } // do stuff } Task Bar(string id){ // argument checking if(id == null) throw new ArgumentNullException(“id”) try{ return […]

为什么异步CTP性能不佳?

我真的不明白为什么await和async不会像我们想象的那样改善我的代码的性能。 虽然持怀疑态度,但我认为编译器应该重写我的方法,以便下载并行完成……但似乎并没有真正发生。 ( 我确实认识到await和async不会创建单独的线程;但是,操作系统应该在parallal中进行下载,并在原始线程中回调我的代码 – 不应该吗? ) 我是否使用async并await不正确? 使用它们的正确方法是什么? 码: using System; using System.Net; using System.Threading; using System.Threading.Tasks; static class Program { static int SumPageSizesSync(string[] uris) { int total = 0; var wc = new WebClient(); foreach (var uri in uris) { total += wc.DownloadData(uri).Length; Console.WriteLine(“Received synchronized data…”); } return total; } static async Task […]