我有两种方法。我想等待第一个,有时候等待另一个(但不是所有的时间)。所以我想我应该使用一项任务,等待它,等待,而不是等待。将同步方法转换为与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