36

I'd like to make a function async, so I simply add async like this:

public async static void something(){
}

You can see that its return-type is void. I just want this function to be called asynchronously without blocking, since return is void so no await is needed.

But Visual Studio 2012 just cannot compile this, it says that I miss await?

Could you please advise a sample that makes a function async without using await.

2
  • Even more interesting is async Methods correct? Resharper warning when Resharper issues warning on async method having await in its body Commented Apr 23, 2013 at 1:58
  • @ГеннадийВанинНовосибирск, in that question Resharper is complaining about the two methods that don't have await in them, not the main method which does have await. Commented Apr 23, 2013 at 2:47

2 Answers 2

39

I think that maybe you misunderstand what async does. The warning is exactly right: if you mark your method async but don't use await anywhere, then your method won't be asynchronous. If you call it, all the code inside the method will execute synchronously.

Also, you should try to avoid using async void methods, they make handling exceptions difficult.

Sign up to request clarification or add additional context in comments.

9 Comments

async make the method itself asynchronous or not when the method get called, if no await anywhere inside the method? As above sample, if I call something(), will it block current thread?
Yes, if you have some long-running code inside something() (and no await), then it will block the thread. That's what the warning is trying to tell you.
async is not something that will make your methods magically not block. If you want to run some code on another thread, use Task.Run().
Ohh, got it, I misunderstand the concert, async mark the method is going to use async call not mean itself is async.
@Patrick Then you can use Task.Run() to run it on another thread.
|
-1

Change to

public async Task something(){
  return await Task.Factory.StartNew(() => {
      //TODO:
  }
}

You do not have to wait for the Task returned ;)

so alternatively You can just use a task and remove both async and await and then you get:

public Task something(){
  return Task.Factory.StartNew(() => {
      //TODO:
  }
}

Task is implict void, if you do not use the generic return type argument

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.