Tag: 异步

在递归方法中使用async / await的正确方法是什么?

在递归方法中使用async / await的正确方法是什么? 这是我的方法: public string ProcessStream(string streamPosition) { var stream = GetStream(streamPosition); if (stream.Items.count == 0) return stream.NextPosition; foreach(var item in stream.Items) { ProcessItem(item); } return ProcessStream(stream.NextPosition) } 以下是使用async / await的方法: public async Task ProcessStream(stringstreamPosition) { var stream = GetStream(streamPosition); if (stream.Items.count == 0) return stream.NextPosition; foreach(var item in stream.Items) { await ProcessItem(item); //ProcessItem() […]

在不等待的情况下调用异步方法

我试图在不等待结果的情况下调用异步方法(在ASP.NET Web API 2应用程序中)。 我的意思是我想要主线程继续执行并且不等待被调用的方法来完成。 我正在尝试这个片段: // The async method: private static async Task LogAsync(Exception exception, string ip, MethodBase method, object parameters) { // some stuff } // The caller methods: public static void Log1(Exception exception, object parameters) { LogAsync(exception, ip, method, parameters); } public static void Log2(Exception exception, object parameters) { Task.Factory.StartNew(() => LogAsync(exception, […]

异步线程和会话

当使用此签名生成新的异步线程时,ASP.NET会话对象是否可用于此新线程? IAsyncResult asyncCall = f.BeginInvoke(null, f);

TCP消息损坏

我有一个简单的TCP服务器,通过GPRS与一些设备通信。 它长时间正常工作没有任何问题。 现在,设备(客户端设备,发送数据)发生了变化,并且它们发送的数据比以前多得多,TCP消息大小可能比之前大10倍。 早先它是最大1024字节/数据消息,现在它可以超过1万字节/消息。 正如我所看到的 – 正如TCP所预测的那样 – 有许多消息被“破坏”,所以不是完整的消息,只有一部分到达,后来可以到另一部分等。 我认为我的服务器 – 基于异步模式 – 以错误的方式处理这种情况,我认为该错误在我的RecieveCallBack函数中。 我找不到正确处理这种情况的方法。 我怎样才能做到这一点? 这是我的RecieveCallBackfunction: public void RecieveCallBack(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; try { Socket handler = state.WorkSocket; int read = handler.EndReceive(ar); if (read > 0) { var data = new byte[read]; Array.Copy(state.Buffer, 0, data, 0, read); } else { if […]

将数据异步加载到Windows窗体中的DataTable中

我正在修改旧的WinForms / ADO应用程序的数据访问层,以通过异步developerforce rest api使用soql来获取Salesforce对象。 以下方法通常有效,除了我的十三个表例程之一永远不会从AddMyTableRow(System.Data.DataRowCollection.Add())方法返回: public void LoadData() { var tasks = new List<Task> { GetObject1Async(), GetObject2Async(),… GetObject13Async() }; Task.WaitAll(tasks.ToArray()); //do some postprocessing now that I have all the data } async Task GetObject1Async(){ var response = await cnx.QueryAsync(“SELECT foo FROM bar”).ConfigureAwait(false); foreach (var rec in response.Records){ var row = MyDataSet.MyTable.NewMyTableRow(); row.Name = rec.Name; […]

从异步方法获取结果

我的服务中有这个方法: public virtual async Task FindByIdAsync(string userId) { this.ThrowIfDisposed(); if (userId == null) { throw new ArgumentNullException(“userId”); } return await this.repository.FindByIdAsync(userId); } 然后在视图中我有这个代码: using (var service = new UserService(new CompanyService(), User.Identity.GetUserId())) { var user = service.FindByIdAsync(id); } 但用户是任务而不是用户 。 我尝试添加等待服务调用,但除非当前方法是异步,否则我不能使用await 。 如何访问User类?

垃圾收集器是否在.NET中的异步调用期间销毁暂时未引用的对象?

想象一下,我将在.NET中进行异步调用,即HttpWebRequest.BeginGetResponse,并且不会在更广泛的范围内引用HttpWebRequest对象。 垃圾收集器会破坏它并导致问题吗? 示例代码: using System; using System.Net; public class AsyncHttpWebRequest { void Main() { var Request = HttpWebRequest.Create(“http://www.contoso.com”); var result = Request.BeginGetResponse(GetResponseCallback, null); } private void GetResponseCallback(IAsyncResult AsyncResult) { // Do Something.. } } 备用版本(请求作为AsyncState传递): using System; using System.Net; public class AsyncHttpWebRequest { void Main() { var Request = HttpWebRequest.Create(“http://www.contoso.com”); var result = Request.BeginGetResponse(GetResponseCallback, Request); […]

为什么在QueueBackgroundWorkItem中使用异步?

使用ASP.NET QueueBackgroundWorkItem方法的async有什么好处? HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => { var result = await LongRunningMethodAsync(); // etc. }); 我的理解是异步函数用于防止长时间运行的任务阻塞主线程。 但是,在这种情况下,我们不是要在自己的线程中执行任务吗? 与非异步版本相比有什么优势: HostingEnvironment.QueueBackgroundWorkItem(cancellationToken => { var result = LongRunningMethod(); // etc. });

ReaderWriterLockSlim和async \ await

我有一些ReaderWriterLockSlim问题。 我无法理解它是如何工作的。 我的代码: private async Task LoadIndex() { if (!File.Exists(FileName + “.index.txt”)) { return; } _indexLock.EnterWriteLock();// _index.Clear(); using (TextReader index = File.OpenText(FileName + “.index.txt”)) { string s; while (null != (s = await index.ReadLineAsync())) { var ss = s.Split(‘:’); _index.Add(ss[0], Convert.ToInt64(ss[1])); } } _indexLock.ExitWriteLock(); } 当我在输入写锁定时,在调试器中我可以看到_indexLock.IsWriteLockHeld为true ,但是当执行步骤为时,我看到_indexLock.IsWriteLockHeld为false而_indexLock.ExitWriteLock抛出exceptionSynchronizationLockException并显示消息“The write锁被释放而没有被举行“。 我做错了什么?

如何将输出值绑定到异步Azurefunction?

如何将输出绑定到异步函数? 将参数设置为out的常用方法不适用于异步函数。 例 using System; public static async void Run(string input, TraceWriter log, out string blobOutput) { log.Info($”C# manually triggered function called with input: {input}”); await Task.Delay(1); blobOutput = input; } 这导致编译错误: [timestamp] (3,72): error CS1988: Async methods cannot have ref or out parameters 使用绑定(fyi) { “bindings”: [ { “type”: “blob”, “name”: “blobOutput”, “path”: “testoutput/{rand-guid}.txt”, […]