事件系统是受到c#的启发,基于事件系统可以更容易地实现程序解耦。
因此,用rust也实现了一个类似的、但更丰富的轻量级事件开发包。
crate地址:https://crates.io/crates/wd_event
git地址:https://gitee.com/yutiandou/wd-event
use wd_event::{EventManage,EConfig,Context,Event,EType,AsyncEvent};
fn main() {
let mut es = EventManage::new(EConfig::default());
//TODO ...
}
#[tokio::main]
async fn main() {
let mut es = EventManage::new_async(EConfig::default()).await;
//TODO ...
}
任何一个实现了Event 特性的类型的实体都可以被注册。事件类型如下三种
sync
struct HandleOne;
impl Event for HandleOne{
fn handle(&self,_ctx:Arc){
println!("execute handlone handle")
}
}
let event_one = String::from("event_one");
es.add( event_one.clone(),HandleOne{},EType::Default).unwrap();
async 注意:一个异步事件是不能被exec_sequence函数顺序执行的
struct AsyncHanle;
#[wd_event::event_trait]
impl AsyncEvent for AsyncHanle{
async fn handle(&self,_ctx:Arc){
tokio::time::sleep(Duration::from_secs(1)).await;
println!("休眠一秒后执行");
}
}
es.add_async(event_one.clone(),AsyncHanle{}).unwrap();
es.exec_sequence(&event_one,None);
es.exec_pool(&event_one,None);
es.exec_immediately(&event_one,None).await;;
上下文用于在对事件的多个回调中传递状态和共享消息。
更改上下文的状态将停止后续的函数调用,只有exec_sequence方法和循环事件才会停止。
更多方法请参考API。
//Create context and add a default message
let a:i32 = 1;
es.exec_sequence(&event_one,Some(Context::new_add_msg(a)));
//Gets the default message for the context
impl Event for HandleOne{
fn handle(&self,ctx:Arc){
let value = match ctx.get_msg::(){
Some(s)=>{
s.add(10)
}
None=>{0}
};
println!("execute handlone handle,get value {}",value);
}
}
//
//delay event and cycle event. only the handle_mut method is called
fn handle_mut(&mut self,ctx:Arc){
let a = match ctx.get_arc_value::(&self.key){
Some(s)=>{
s.add(1)}
None=>{0}
};
println!("循环{}次",a);
ctx.set_value(&self.key, a);
}
//Once a second
es.delay_exec(Cycle{key:"default".to_string()},Context::new_delay(std::time::Duration::from_secs(1),true));
任务池功能,集成到事件管理器中。使用exec_pool函数。
当然,也可以单独使用任务池函数,详见API。
对象池,目前只是一个简单的实现。
值得考虑的是,rust是否真的需要对象池?