我有兩種方法。我想等待第一個,有時候等待另一個(但不是所有的時間)。所以我想我應該使用一項任務,等待它,等待,而不是等待。將同步方法轉換爲與C#異步#
編輯:事實上,我只需要一個火,忘記呼叫? :
public class TestController : ApiController
{
public IHttpActionResult Get(int id)
{
Stopwatch sw = Stopwatch.StartNew();
JobRunner runner = new JobRunner();
bool iWantToWait = id == 1;
string jobId = runner.Run(!iWantToWait);
sw.Stop();
return Ok("Ok " + jobId + " # " + sw.Elapsed);
}
}
public class JobRunner
{
public string Run(bool fireAndForget)
{
ShortMethodIAlwaysWantToWait();
string jobId = Guid.NewGuid().ToString("N");
if (fireAndForget)
HostingEnvironment.QueueBackgroundWorkItem(token => LongMethodICouldWantToWaitOrNot(jobId));
else
LongMethodICouldWantToWaitOrNot(jobId);
return jobId;
}
private void ShortMethodIAlwaysWantToWait()
{
// ...
}
private void LongMethodICouldWantToWaitOrNot(string jobId)
{
// ...
}
}
雖然請注意,由於LongMethod現在在同一個線程上運行,因此您不會等待'ShortMethodIAlwaysWantToWait' – 2015-03-03 10:11:38
。雖然可以很容易地用'await Task.Run()'在另一個線程上運行。 – GazTheDestroyer 2015-03-03 10:11:43
感謝您的回答。 Thread.Sleep當然是一個例子,我正在訪問一些資源。我是否需要異步LongMethodICouldWantToWaitOrNot?或者它只能是一個空白? – Tim 2015-03-03 10:13:07