我在我的应用程序中有以下代码.
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
我创建了一个演示问题的线程示例,我已将其上传到此处.我希望解决这个问题也能解决我的问题.请检查样品.
我有一个WCF服务,它使用套接字异步,我有一些性能问题,所以我决定重构代码,我读了一些关于F#的异常和多线程的易用性的文章,等等,但我想知道使用F#parallelism我会获得更好的性能吗?并且它很容易与WCF服务兼容,我有大量的数据应该通过套接字传输(在tcp上),因此拥有良好的性能和并行算法非常重要.
我目前在使用抛出异常的方法时遇到了一些问题,但我不确定原因.该异常使我的应用程序崩溃.
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) 如何将此同步方法调用链转换为异步(使用 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) 我找到了一个用于连接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返回之前等待库工作完成?
我已经对这个主题进行了大量的搜索,我在这个网站上阅读了关于这个主题的大部分帖子,但是我仍然感到困惑,我需要一个直接的答案.这是我的情况:
我有一个已建立的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) 我需要等待我async void完成.它有一些await Task.Delay功能,我需要它们继续之前完成.这个空格不会返回任何内容,所以我没有看到制作它的理由async Task<>,我也在这个空格内乱洗一个数组,我声明了一些变量.那我该怎么做呢?是async Task<>唯一的方法吗?我的空虚并不期待任何参数/输入.
我有一个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)
这可能是我正在寻找的一个非常基本的东西,我似乎无法找到它...任何建议?
我希望返回一个稍后自行解决的 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)
有没有更好的方法来实现这个功能?
我正在使用支持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)