C# 调用无效任务的正确方法

C# 调用无效任务的正确方法,c#,async-await,class-library,C#,Async Await,Class Library,我想检查一下,以确保当一个方法只返回Task而不返回Task时,我调用了返回void的方法 我有一个助手方法,它的签名如下: internal async static Task DrawLeafMidrail(Graphics dc, float totalHeightFeet, List<HorizontalContainer> horizontals, bool showDetails, bool showVerticalDetails) {

我想检查一下,以确保当一个方法只返回
Task
而不返回
Task
时,我调用了返回void的方法

我有一个助手方法,它的签名如下:

internal async static Task DrawLeafMidrail(Graphics dc, float totalHeightFeet,    List<HorizontalContainer> horizontals, bool showDetails, bool showVerticalDetails)
        {
            await Task.Run(() =>
            {
                float y, sl, startX, endX, stileWidth = 0, btmRailPx = 0, leftJmb;
                PointF[] points;
                List<VerticalContainer> verticals = new List<VerticalContainer>();
                List<LineContainer> lines = new List<LineContainer>();

                //..code omitted
            });
        }
请注意,调用程序的末尾追加了
.Wait()
。我只想确保这是正确的方法,这将产生与调用方调用helper方法相同的效果,如:

Task t = Horizontal.DrawLeafMidrail(dc, doorPoints.BayRect.Height / Constants.PIXELS_PER_FOOT, lstHors, i == 0, forDoorDetail);
t.Wait();
我想检查一下,以确保当一个方法只返回Task而不返回Task时,我调用了返回void的方法

这部分问题没有意义

我只是想确保这是正确的方法,并且会产生同样的效果

会有同样的效果吗?对<代码>任务不会更改表达式求值、运算符优先级或局部变量的行为方式


对吗?不可以。您应该使用
wait
。否则,正如我在MSDN文章中所解释的那样,您将看到我的编辑,他没有正确地使用代码格式。非常好的答案,我已经打印了这篇博文,并将与这些答案一起阅读。@Stephen,伟大的文章人!我现在能更好地掌握这一点了。“Little”。不管怎样,我所做的只是自动包装一个方法的整个主体,主要是那些不返回任何东西/有点像fire和遗忘的助手。因此,现在我已经删除了Task.Run(),它包装了整个方法体,现在将wait放在helper方法的中,并附加了.configurewait(False)因为我不在乎调用那个助手后会发生什么。所以基本上,在我卸载已经是异步任务的工作负载的地方,我保持了这种方式,并将wait放在调用的地方,在一个主函数中,我将一个接一个地排列助手,不需要将所有助手包装在一个任务中。Run()。我没有得到的一个方面是关于SemaphoreSlim mutex=newsemaphoreslim(1)。在某种程度上,似乎应该有一种方法来传递状态对象。没有理由第一种方法是
async
。只需
返回
任务创建的任务。以未标记为
async
的方法运行
。它将做完全相同的事情,但不会有
async
添加到方法中的所有开销。当然,您通常不应该对任务执行阻塞等待,您应该只添加延续(可能通过
wait
)。@Servy实际上,在这种情况下,行为可能会有所不同,尽管不是很好。使用<代码>等待<代码>,<代码> WAITE()/代码>可能会导致死锁,而根据您的建议,它将正常工作(如果您考虑阻止线程正确)。
Task t = Horizontal.DrawLeafMidrail(dc, doorPoints.BayRect.Height / Constants.PIXELS_PER_FOOT, lstHors, i == 0, forDoorDetail);
t.Wait();