标签: asynchronous

在调用开始之前,迭代中的值会发生变化

我在我的应用程序中有以下代码.

MyEventHandler handler = null; //Declare the handler

foreach (string pname in group)
{
  handler = getHandler(pname); //Get the handler
  if(handler == null)
  {                        
      throw new KeyNotFoundException("No user " + pname + " could be found");
  }
  //invoke the handler
  handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
}
Run Code Online (Sandbox Code Playgroud)

所以我得到了处理程序和调用BeginInvoke方法.但是在BeginInvoke被调用之前它会进入下一次迭代并且处理程序值会发生变化.因此BeginInvoke,这个新的处理程序正在参与其中.

希望你明白我的观点.那我怎么能消除这个问题呢?BeginInvoke因为我觉得这是一个时间的流逝,我不想打电话给睡觉.

有任何想法吗?

Update1 我很确定在调用BeginInvoke()之前处理程序对象会被更改.我猜BeginInvoke需要一些时间来创建一个单独的线程来调用另一个函数.

UPDATE2 此代码位于WCF服务中,客户端调用一个函数,该函数依次使用此函数.我为每个客户端分别存储在我的服务器中的处理程序.WCF服务具有双工合同,为客户端分隔会话.我看到执行此函数后,同一个用户被调用两次.但我设置了一个断点并调试它(这给BeginInvoke提供了调用函数所需的时间)它"完美地"工作.我非常确定我在线程中也遇到了这个问题,我在循环中创建了多个线程.如果线程委托具有参数a,b,c,并且如果在下一次迭代开始时更改它,则会发生相同的行为.我之前有多少人遇到过这个问题.如果我放一个Sleep()或者如果我复制一个处理程序并使用copy调用它就可以了.

UPDATE3

好的,我现在已经测试过了.我刚刚添加了Thread.Sleep(),如下所示.

chatTo.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
Thread.Sleep(500);
Run Code Online (Sandbox Code Playgroud)

它的工作就像一个魅力.有什么想法吗?

更新4

我创建了一个演示问题的线程示例,我已将其上传到此处.我希望解决这个问题也能解决我的问题.请检查样品.

.net c# scope asynchronous

-2
推荐指数
1
解决办法
227
查看次数

异步套接字编程和F#

我有一个WCF服务,它使用套接字异步,我有一些性能问题,所以我决定重构代码,我读了一些关于F#的异常和多线程的易用性的文章,等等,但我想知道使用F#parallelism我会获得更好的性能吗?并且它很容易与WCF服务兼容,我有大量的数据应该通过套接字传输(在tcp上),因此拥有良好的性能和并行算法非常重要.

c# sockets f# asynchronous c#-to-f#

-2
推荐指数
1
解决办法
2606
查看次数

异步方法抛出异常

我目前在使用抛出异常的方法时遇到了一些问题,但我不确定原因.该异常使我的应用程序崩溃.

System.NullReferenceException: Object reference not set to an instance of an object.  
   at Myapp.AutoProcess.<ToRead>d__36.MoveNext()  
--- End of stack trace from previous location where exception was thrown ---  
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__1(Object state)  
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)   
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,    ContextCallback callback, Object state, Boolean preserveSyncCtx)  
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback   callback, Object state, Boolean preserveSyncCtx)  
   at   System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()  
   at System.Threading.ThreadPoolWorkQueue.Dispatch() 
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
Run Code Online (Sandbox Code Playgroud)

我在一个单独的线程上运行该方法

Thread listenerThread = new Thread(() => ToRead());
listenerThread.Start();
Run Code Online (Sandbox Code Playgroud)

抛出异常的方法如下所示:

private async void ToRead()
{
    while (true)
    {
        if (this.toRead.Count != 0)
        { …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading asynchronous task

-2
推荐指数
1
解决办法
7557
查看次数

C#中将一系列同步方法转换为异步方法

如何将此同步方法调用链转换为异步(使用 async/await 运算符)?鉴于只有最后一个调用 DoRequest() 需要时间来执行,这是唯一需要成为异步的方法吗?或者链中的所有调用者 RequestSomething() 和 Process() 都需要异步吗?

[HttpGet]
void Process()
{
   var url = "http://someapi.com";
   var myObject= RequestSomething(url);
   //do something with the myObject.
}    

MyObject RequestSomething(string url)
{
   var request = new HttpRequestMessage(HttpMethod.Get, url);
   var response = DoRequest(request);
   return JsonConvert.DeserializeObject<MyObject>(response);
}

//method that takes time to return.
HttpResponseMessage DoRequest(HttpRequestMessage request)
{
    var client = new HttpClient();
    return client.SendAsync(request).Result;
}
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous async-await

-2
推荐指数
1
解决办法
336
查看次数

Objective C异步到同步数据库访问

我找到了一个用于连接Microsoft SQL Server数据库的开源Objective-C库.

问题是,我想同步使用它.

这就是我的Swift项目使用库的方式.

func execute(query: String) {

    self.client.connect(host + ":" + port, username: username, password: password, database: database) { (connected) -> Void in
        if connected {
            self.client.execute(query, completion: { (results: Array<AnyObject>!) -> Void in
                self.result = results[0] as! Array<AnyObject>
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

传递的块由库异步执行.有没有办法让代码同步执行,这样每当我调用时execute,该线程在execute返回之前等待库工作完成?

sql asynchronous swift

-2
推荐指数
1
解决办法
138
查看次数

同步执行异步功能

我已经对这个主题进行了大量的搜索,我在这个网站上阅读了关于这个主题的大部分帖子,但是我仍然感到困惑,我需要一个直接的答案.这是我的情况:

我有一个已建立的Winform应用程序,我无法将其全部"异步".我现在被迫使用一个全部写为异步函数的外部库.

在我的申请中,我有

/// <summary>
/// This function I can't change it to an 'async'
/// </summary>
public void MySyncFunction()
{
    //This function is my point in my application where I have to call the
    //other 'async' functions but I can't change the function itself to 'async'

    try
    {
        //I need to call the MyAsyncDriverFunction() as if it is a synchronous function
        //I need the driver function to finish execution and return before processing the code that follows it
        //I …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous winforms async-await .net-4.5

-2
推荐指数
1
解决办法
147
查看次数

如何等待async void完成?

我需要等待我async void完成.它有一些await Task.Delay功能,我需要它们继续之前完成.这个空格不会返回任何内容,所以我没有看到制作它的理由async Task<>,我也在这个空格内乱洗一个数组,我声明了一些变量.那我该怎么做呢?是async Task<>唯一的方法吗?我的空虚并不期待任何参数/输入.

c# asynchronous task async-await

-2
推荐指数
1
解决办法
5296
查看次数

异步任务未触发

我有一个async task方法,我正在调用页面加载,它成功进入方法,但它"冻结"在一行,我将在下面指出,我无法弄清楚为什么.

 protected void Page_Load(object sender, EventArgs e)
 {
     ParseClient.Initialize("AppKey", ".NetKey");

     Load().Wait();
 }    

 public async Task Load()
 {
     ParseQuery<ParseObject> myQuery = ParseObject.GetQuery("myClass");
     IEnumerable<ParseObject> results = await myQuery.FindAsync();
     foreach (ParseObject result in results)
     {
         string firstName = result.Get<string>("name");
     }
 }
Run Code Online (Sandbox Code Playgroud)

在这条线上对我来说是"冻结":

IEnumerable<ParseObject> results = await myQuery.FindAsync();
Run Code Online (Sandbox Code Playgroud)

这可能是我正在寻找的一个非常基本的东西,我似乎无法找到它...任何建议?

c# asynchronous wait async-await parse-platform

-2
推荐指数
1
解决办法
494
查看次数

Promise 语法/替代

我希望返回一个稍后自行解决的 Promise,但似乎我的语法无效,我很好奇什么是更好的实现。为什么 Promise 构造函数需要执行器?

promise = new Promise() 无效,因为我需要提供一个函数

function getDetails (someHash) {
    var url = "http://somewebsite.com/" + someHash,
        promise = new Promise();

     makeAjaxRequest(url, function (response) {
         promise.resolve(response.data);
     });

     setTimeout(function () {
         promise.reject("timeout");
     }, 500);

     return promise;
}

function makeAjaxRequest (url, callback) {
    var someResponse = {data: "some data"};

    setTimeout(function () {
        callback(someResponse);
    }, 200);
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这个功能?

javascript asynchronous promise

-2
推荐指数
1
解决办法
1933
查看次数

eslint解析错误:解析错误:意外的令牌=>

我正在使用支持ES6的节点v7.10.0,因此我没有透露我的代码.

ESLint v3.19.0 Parsing error: Unexpected token =>在以下代码中给出错误.

给出错误:

module.exports = {

    index: async (req, res) => {
        await functionThatReturnsSomePromise();
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,当我只使用功能时,它会因错误而失败 Parsing error: Unexpected token function

给出错误:

module.exports = {

    index: async function(req, res) {
        await functionThatReturnsSomePromise();
  }
}
Run Code Online (Sandbox Code Playgroud)

当我定义这样的类时,linter不会抱怨它:

没有错误:

class test {

    testing() {
        async () => {
            console.log('test');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

.eslintrc

{
  "extends": "eslint:recommended",
  "ecmaFeatures": {
    "binaryLiterals": true,                    // enable binary literals
     "blockBindings": true,                      // enable let and const (aka block bindings)
     "defaultParams": …
Run Code Online (Sandbox Code Playgroud)

asynchronous node.js async-await eslint

-2
推荐指数
1
解决办法
5326
查看次数