我有一个函数,我们称之为Func1和it containsFunc2&事件处理程序.
现在我想要实现的是not let函数(Func1)返回值,直到Func2触发并处理事件.
基本上Func1将字符串作为返回值,并在事件处理程序中设置字符串值.所以我需要等待处理事件然后返回值.
代码示例
public static string Fun1 ()
{
string stringToReturn = String.Empty;
Func2(); //Func2 will after few sec fire event bellow
example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) =>
{
stringToReturn = "example"; //this wont be hardcoded
};
//wait for event to be handled and then return value
return stringToReturn;
}
Run Code Online (Sandbox Code Playgroud) 是不是可能在一个线程中的wait()之前调用另一个线程中的notify()?它发生在我身上.
客户端从目标请求值并等待结果变量RV.如果目标是客户端本身,我使用正确的结果更新RV并在另一个线程中调用RV上的notify().
class EMU {
ResultVar RV;
Address my_address;
ResultVar findValue(String key) {
String tgt = findTarget(key);
sendRequest(tgt, key);
synchronized(RV) {
RV.wait();
}
return RV;
}
Runnable Server = new Runnable() {
public void run() {
//code to receive connections. Assume object of type Request is read from the stream.
Request r = (Request) ois.readObject();
if(r.requesterAddr.compareTo(my_address) == 0) {
String val = findVal(key);
RV.putVal(val);
synchronized(RV){
RV.notify();
}
}
}
};
}
Run Code Online (Sandbox Code Playgroud)
问题是在请求者自己完成所有"网络"(上例中的sendReqest)之前,结果会在结果变量中更新.当请求者线程现在调用wait()时,程序不会继续,因为已经调用了notify.
我们怎样才能防止它呢?
我读了前面的问题fork和exec之间的差异,但它让我有些疑惑.
在使用fork()并且你对孩子调用exec时,创建的新进程exec仍然是孩子吗?
杀死父进程是否也杀死了孩子?
在顶部答案中显示的绘图/示例中,他调用wait/,waitpid因为如果父进程首先终止,子进程终止,然后您获得该ls命令的部分输出或没有输出,这是正确的吗?
有没有办法让PHP等到函数返回后再继续?
这是我的代码:
<?php
set_time_limit(0);
function waitforchange($nof) {
$lfilemod=filemtime($nof);
while(filemtime($nof) == $lfilemod) {
clearstatcache();
usleep(10000);
}
}
waitforchange('./blahblah.txt')
sleep(5);
echo 'done';
?>
Run Code Online (Sandbox Code Playgroud)
它应该等到blahblah.txt更改,然后等待另外五秒,然后打印出"完成",然而,无论文件是否实际更改,它都会在五秒后打印出"完成".
我正在尝试实现一个停止和等待算法.我在发件人实施超时时遇到问题.在等待来自接收方的ACK时,我正在使用recvfrom()函数.然而,这使程序空闲,我无法按照超时重新传输.
这是我的代码:
import socket
import time
mysocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
ACK= " "
userIn=raw_input()
if not userIn : break
mysocket.sendto(userIn, ('127.0.0.01', 88))
ACK, address = mysocket.recvfrom(1024) #the prog. is idle waiting for ACK
future=time.time()+0.5
while True:
if time.time() > future:
mysocket.sendto(userIn, ('127.0.0.01', 88))
future=time.time()+0.5
if (ACK!=" "):
print ACK
break
mysocket.close()
Run Code Online (Sandbox Code Playgroud) 我在azure网站上使用webjob来处理占用大量内存的繁重进程.该进程后端执行大量Web调用,因此将其设计为异步.我希望webjob只处理每个实例的一个请求.我已经设置了Queues.BatchSize = 1选项来禁用webjob中的并行.但是,当我使用await来调用异步方法时,下一条消息仍然会立即从队列中获取,因为await并没有真正阻止当前线程,这对UI应用程序很有用,但不适用于我的情况.
所以我尝试使用wait来阻止当前线程,直到所有后端进程完成.但是,在该过程完成后抛出异常.似乎webjob在等待后删除队列存在问题.
我附上了简化的测试代码和例外.有任何想法吗?
非常感谢您的帮助!
名称空间ProcessWebJob {
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("testQueue")] string message, TextWriter log)
{
try
{
testAsync ts = new testAsync();
var task = Task.Run(async () => { await ts.test(); });
task.Wait();
}catch(Exception e){
Trace.TraceInformation("error on processing the queue message" + e.InnerException);
}
}
}
public class testAsync {
public async Task<int> test()
{
await Task.Delay(10000); //10 seconds delay
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
}
[10/07/2015 17:57:14> 278796:错误]未处理的异常:Microsoft.WindowsAzure.Storage.StorageException:远程服务器返回错误:(404)Not Found.---> System.Net.WebException:远程服务器返回错误:(404)Not Found.[10/07/2015 17:57:14> 278796:ERR]在Microsoft.WindowsAzure.Storage.Shared.Protocol.HttpResponseParsers.ProcessExpectedStatusCodeNoException [T](HttpStatusCode …
我正在查看系统调用的文档,wait4()并在其手册页中编写了该文档
这些功能已过时;在新程序中使用
waitpid(2)或使用waitid(2)。
因此,我浏览了的文档,waitpid()发现两者之间存在差异。
waitpid()与的功能相同wait4(),但wait4()根据手册页,
另外,在指向的结构中返回有关子级的资源使用信息
rusage。
这两个系统调用定义如下
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
pid_t waitpid(pid_t pid, int *status, int options);
Run Code Online (Sandbox Code Playgroud)
现在,我还阅读了另一个系统调用,它完成了获取rusage孩子的任务,即getrusage()。
因此,我可以理解,wait4()通过结合使用waitpid()和和,可以做同样的事情getrusage()。
但是,我不了解的是,总是有很强的理由使系统调用过时。但是在这种情况下,感觉功能已被拆分。
waitpid()和getrusage(),我要检查返回值的两倍,这是不是对的情况
wait4()。wait4()来获得rusage一个特定的孩子,但是waitpid()可以将rusage其所有孩子在一起(如果与一起使用RUSAGE_CHILDREN)。如果子进程多于少数,这听起来像是额外的开销。为什么wait4()过时了?看来这使事情变得更加艰难。
我想将测试进度延迟T秒,而不会产生超时。
首先,我尝试了显而易见的方法:
sleep(5)
XCTAssert(<test if state is correct after this delay>)
Run Code Online (Sandbox Code Playgroud)
但这失败了。
然后我尝试了:
let promise = expectation(description: "Just wait 5 seconds")
waitForExpectations(timeout: 5) { (error) in
promise.fulfill()
XCTAssert(<test if state is correct after this delay>)
}
Run Code Online (Sandbox Code Playgroud)
我XCTAssert()现在成功了。但是waitForExpectations()由于超时而失败。
这是根据XCTest等待函数的文档说的:
超时始终被视为测试失败。
我有什么选择?