Tag: asynchronous

C#中具有超时function的通用异步重试

我有几百个对各种外部API的调用,我希望将其包装在能够进行重试和处理超时的通用异步函数中。 基本上,我认为我需要实现类似这样的函数调用: await Retry(()=>someFunctionAsync(doWorkParams, new CancellationToken()), retryCount, timeout); 如何定义此类重试function? 另外,如何从同步代码中调用此function,因为我的调用大量存在于同步方法中?

清理TPL中的CallContext

根据我是使用基于异步/等待的代码还是基于TPL的代码,我在清理逻辑CallContext遇到两种不同的行为。 如果我使用以下async / await代码,我可以完全按照我的预期设置和清除逻辑CallContext : class Program { static async Task DoSomething() { CallContext.LogicalSetData(“hello”, “world”); await Task.Run(() => Debug.WriteLine(new { Place = “Task.Run”, Id = Thread.CurrentThread.ManagedThreadId, Msg = CallContext.LogicalGetData(“hello”) })) .ContinueWith((t) => CallContext.FreeNamedDataSlot(“hello”) ); return; } static void Main(string[] args) { DoSomething().Wait(); Debug.WriteLine(new { Place = “Main”, Id = Thread.CurrentThread.ManagedThreadId, Msg = CallContext.LogicalGetData(“hello”) }); } […]

等待和等待在C#5.0异步

任务或任务对象是等待的,因此我们可以在返回值为Task或Task 的对象上使用await键。 任务或任务是最常用的等待对象。 我们也可以定义我们自己的等待对象。对象应该具有以下资格。 它有一个GetAwaiter()方法(实例方法或扩展方法); 它的GetAwaiter()方法返回一个awaiter。 在下列情况下,对象是等待者: 它实现了INotifyCompletion或ICriticalNotifyCompletion接口; 它有一个IsCompleted,它有一个getter并返回一个布尔值; 它有一个GetResult()方法,它返回void或结果。 我的问题是为什么微软没有提供限制这些等待对象的界面? 目前实现等待对象的方法有点复杂。

在 WCF服务异步和使用客户端上的任务调用同步方法之间是否存在显着差异?

如果我有一个定义的服务: [ServiceContract(SessionMode = SessionMode.NotAllowed)] public interface IMyService { [OperationContract(IsOneWay = true)] [ReceiveContextEnabled(ManualControl = true)] void DoSomething(Message message); } 我想从我的客户端异步调用它(使用不从svcutil生成的共享契约或添加服务引用)我可以这样做: Task task = Task.Factory.StartNew(() => myService.DoSomething(message)); … some other code task.Wait(); 我也可以将我的服务定义为异步: [ServiceContract(SessionMode = SessionMode.NotAllowed)] public interface ICacheKeyExchangeAsync { [OperationContract(IsOneWay = true, AsyncPattern = true)] [ReceiveContextEnabled(ManualControl = true)] IAsyncResult BeginDoSomething(Message message, AsyncCallback callback, object state); void […]

如何在计时器中使用async和await

我的Windows应用程序的要求是: 使用HttpWebRequest在一个线程中每3秒获取一次Web请求/响应(总共大约有10个线程用于执行此Web请求/响应。) 每个线程使用一些全局变量。 我想使用System.Timers.Timer和async并等待。 但我不知道这是高性能的最佳方式。 然后如何测试它们。 我是C#的绿色。

什么是Microsoft.Bcl.Async?

什么是Microsoft.Bcl.Async以及它用于什么? 我在包页面上看到: 此程序包使Visual Studio 2012项目能够使用新的“异步”和“等待”关键字。 但是可以看到我的VS2012支持异步并等待没有任何额外的包。 那么我应该为我的C#4.5’异步’项目安装软件包吗?

await task.run vs await c#

我在网上搜索并看到很多关于task.run和等待异步的问题,但是有一个特定的使用场景,我并不是真的理解它们的区别。 我相信情景非常简单。 await Task.Run(() => LongProcess()); VS await LongProcess()); 其中LongProcess是一个异步方法,其中包含一些异步调用,例如调用db并等待ExecuteReaderAsync()。 题: 这种情况下两者之间有什么区别吗? 任何帮助或输入赞赏,谢谢!

SSH.Net异步文件下载

我试图使用SSH.NET从SFTP服务器异步下载文件。 如果我同步执行它,它工作正常,但当我执行异步时,我得到空文件。 这是我的代码: var port = 22; string host = “localhost”; string username = “user”; string password = “password”; string localPath = @”C:\temp”; using (var client = new SftpClient(host, port, username, password)) { client.Connect(); var files = client.ListDirectory(“”); var tasks = new List(); foreach (var file in files) { using (var saveFile = File.OpenWrite(localPath + […]

异步ShowDialog

我正在使用async / await从数据库异步加载我的数据,在加载过程中,我想弹出一个加载表单,它只是一个带有运行进度条的简单表单,表示有一个正在运行的进程。 加载数据后,对话框将自动关闭。 我怎样才能做到这一点? 以下是我目前的代码: protected async void LoadData() { ProgressForm _progress = new ProgressForm(); _progress.ShowDialog() // not working var data = await GetData(); _progress.Close(); } 更新: 我设法通过更改代码来使其工作: protected async void LoadData() { ProgressForm _progress = new ProgressForm(); _progress.BeginInvoke(new System.Action(()=>_progress.ShowDialog())); var data = await GetData(); _progress.Close(); } 这是正确的方式还是有更好的方法? 谢谢你的帮助。

ApiController Post中的Async和Await

我还不太清楚异步并等待.net 4.5。 到目前为止,我想我明白等待: 将函数(右侧)放在一个单独的线程上。 将执行放回当前函数的调用者 但保持当前函数的代码“hostage”的其余部分,直到等待(异步)函数完成。 如果我误解了什么,请纠正我。 所以,如果上面的描述是真的,我会遇到一个我想要异步的ApiController的Post函数: [HttpPost] public async Task Post([FromBody]MyObject obj) { myDataContext.MyObjects.InsertOnSubmit(obj); myDataContext.SubmitChanges(); await SomeReallyLongRunningTaskAsync(); // obj would now have the new Id, which I’m really after. return Request.CreateResponse(HttpStatusCode.Created, obj); } 因此,如果我正确理解这一点,Post将完成执行并将控制权返回给调用myApiController.Post(obj) 。 但是我没有HttpResponseMessage对象,因为等待保持return Request.CreateResponse(HttpStatusCode.Created, obj); “人质”。 在上面这个简单的例子中,调用会立即返回客户端(即客户端JS网站还是移动应用程序)? 如果是这样,它会是201,400,500(最好不是),其他人呢?