c# - awaitable lambdas -
c# - awaitable lambdas -
dynamic evaluations in key listener public class keyupper { func<key, bool> _evaluate; public void registerevaluator(func<key, bool> evaluate){ _evaluate = evaluate; } public void keyup(object sender, keyeventargs e){ if (_evaluate(e.keycode)) someresponse(); } public void someresponse(){ // ... } } this lambda should await on each line keyupper.registerevaluator(key => { if (key == key.a) if (key == key.w) if (key == key.a) homecoming true; } ); i.e. client code provide series of evaluations on same key argument expectation each line of evaluation awaited someresponse() invoked after sequence of keyup events of 1:a 2:w 3:a obviously @ moment never happen because method run until end , key == key.w never true it may not possible, there way create method invocation automagically homecoming next line if evaluates false homecoming until line evaluates true, next through line after that, , line after until end of method? i.e. might there simple way provide awaitable lambda expressions of kind?
if asynchronicity not requirement , fine having 1 thread waits, giving lambda blocking way access key. example:
public void registerevaluator(func<func<key>, bool> evaluate); … keyupper.registerevaluator( getkey => getkey() == key.a && getkey() == key.w); registerevaluator spin new thread calls lambda in loop, passing method accesses key, blocking if no key available @ moment, illustration using blockingcollection<key>.
if think doing way wasteful (it is), , can utilize async-await, create lambda async , alter passed in method 1 asynchronous too:
public task registerevaluator(func<func<task<key>>, task<bool>> evaluate); … keyupper.registerevaluator( async getkey => await getkey() == key.a && await getkey() == key.w); implementation of latter version (using blockbuffer<key>) this:
class keyupper { private readonly bufferblock<key> m_keybuffer = new bufferblock<key>(); public async task registerevaluator( func<func<task<key>>, task<bool>> evaluate) { while (true) { if (await evaluate(m_keybuffer.receiveasync)) someresponse(); } } public void keyup(object sender, keyeventargs e) { m_keybuffer.post(e.key); } private void someresponse() { // whatever } } now, i'm not sure how want handle matching keys, think it's not this. example, sample code match sequence of keys baw, not aaw.
another alternative not using func<task<key>>, custom awaitable can awaited multiple times , gives 1 key each time that:
public task registerevaluator(func<keyawaitable, task<bool>> evaluate); … keyupper.registerevaluator( async getkey => await getkey == key.a && await getkey == key.w); but think doing way more confusing , harder do.
c# .net delegates lambda async-await
Comments
Post a Comment