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

Popular posts from this blog

delphi - blogger via idHTTP : error 400 bad request -

c++ - compiler errors when initializing EXPECT_CALL with function which has program_options::variables_map as parameter -

How do I check if an insert was successful with MySQLdb in Python? -