c# - async/await approach for Fire and Forgot -


let's have following code in winforms app.

    private async task<decimal> divasync(int a, int b)     {         await taskex.delay(2000);         return / b;     }      private async task divasyncwitherrorhandling(int a, int b)     {         try         {             await divasync(a, b);         }         catch (dividebyzeroexception)         {             debug.writeline("divasync({0}, {1}) failed", a, b);         }     }      private void button1_click(object sender, eventargs e)     {         divasyncwitherrorhandling(5, 0);     }      private void button2_click(object sender, eventargs e)     {         taskex.run(() => divasyncwitherrorhandling(5, 0));     }      private async void button3_click(object sender, eventargs e)     {         await divasyncwitherrorhandling(5, 0);         await somethingelse();     } 

obviously real word code else. point is, have error handling. code divasyncwitherrorhandling may run await (see example button3_click) can not use async void approach may run fire , forgot.

button1_click , button2_click both produce excepted result (divasyncwitherrorhandling run asynchronous without blocking ui differt advantages / disadvantages.

button1_click shows warning because call not awaited, execution ... continues before call complete. has less code

enter image description here

button2_click not show warning, has more code write , uses task.

so question is. best solution in case? ignore warning , use button1 or use button2.

maybe there better solution buildin similar task.runsynchronously fire , forgot.

divasyncwitherrorhandling(5, 0).runasynchronously();

the purpose convert "old style" routine takes optional action continue after completion async/await pattern

    private divasyncwitherrorhandlingold(int a, int b, action after = null)     {         task.factory.startnew(() =>         {             try             {                 div(a, b);             }             catch (dividebyzeroexception)             {                 debug.writeline("divasync({0}, {1}) failed", a, b);             }             after?.invoke();         });     } 

go task.run since it's more obvious going on , it's recommended approach.

"the run methods preferred way create , start tasks when more control on creation , scheduling of task not needed." source: https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming

"if work have cpu-bound , care responsiveness, use async , await spawn work off on thread task.run." source: https://docs.microsoft.com/en-us/dotnet/csharp/async


Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -