我有一个WPF应用程序,它广泛使用await
和async
方法。我可以在几个地方呼叫await Task.Delay(...);
来插入暂停。但是我遇到的麻烦是虽然很多这些停顿都可以稍微偏离,但有些地方我绝对需要暂停才能准确。换句话说,如果我调用await Task.Delay(2000);
,我的应用程序中有一些地方需要保证它只会暂停2秒(而不是2.2秒)。
我认为麻烦来自这样一个事实:我确实有很多不同的异步方法,所以当我告诉其中一个延迟时,线程池中没有足够的线程当它应该返回时活着,无意间造成比预期更长的延误。
如果您的业务需求尽可能准确,那么线程的C#“最佳做法”是什么?很明显,异步方法似乎并不足够(即使它们很好阅读)。我应该手动创建具有更高优先级的线程并使用Thread.Sleep吗?我是否增加线程池中的线程数?我使用的是BackgroundWorker吗?
答案 0 :(得分:5)
你不能真正使Task.Delay
本身更准确,因为它基于内部Threading.Timer
,其分辨率最高可达15毫秒,并且调度线程池的回调需要时间。< / p>
如果你真的需要准确,你需要一个专用线程。您可以使用Thread.Sleep
让它睡2秒钟,当它醒来时,做你需要做的事。
由于Thread.Sleep
导致线程离开CPU的上下文切换,因此更准确的选择是执行“忙等待”(例如使用{{1}循环)。这将消除上下文切换回CPU的成本,这需要一些时间。
您应该意识到这些选项需要太多资源,您应该考虑是否真的有必要。
答案 1 :(得分:1)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/account_opening_grey_bg"
android:baselineAligned="false"
android:orientation="vertical"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp" >
<com.widgets.TextViewRobotoRegular
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:layout_weight="0.6"
android:gravity="center"
android:text="@string/lbl_acc_header" />
<android.support.v7.widget.CardView
android:id="@+id/cardStep1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:foreground="?android:attr/selectableItemBackground"
app:cardBackgroundColor="@color/white"
card_view:cardCornerRadius="@dimen/dimen_2"
card_view:cardElevation="@dimen/dimen_2"
card_view:cardUseCompatPadding="true" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<View
android:layout_width="4dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/step_one_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text="@string/lbl_step_one"
android:textColor="@color/step_one_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepOneDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblStepOne"
android:layout_alignStart="@+id/lblStepOne"
android:layout_below="@+id/lblStepOne"
android:layout_marginTop="5dp"
android:text="@string/lbl_step_one_details"
android:textColor="@color/txt_black" />
<ImageView
android:id="@+id/imgStep1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:layout_marginTop="15dp"
android:src="@drawable/menu_ipo" />
</RelativeLayout>
</android.support.v7.widget.CardView>
<View
android:layout_width="1dp"
android:layout_height="25dp"
android:layout_gravity="right"
android:layout_marginRight="40dp"
android:background="#666" />
<android.support.v7.widget.CardView
android:id="@+id/cardStep2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:foreground="?android:attr/selectableItemBackground"
app:cardBackgroundColor="@color/white"
card_view:cardCornerRadius="@dimen/dimen_2"
card_view:cardElevation="@dimen/dimen_2"
card_view:cardUseCompatPadding="true" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<View
android:layout_width="4dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/step_two_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text="@string/lbl_step_two"
android:textColor="@color/step_two_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepTwoDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblStepTwo"
android:layout_alignStart="@+id/lblStepTwo"
android:layout_below="@+id/lblStepTwo"
android:layout_marginTop="5dp"
android:text="@string/lbl_step_two_details"
android:textColor="@color/txt_black" />
<ImageView
android:id="@+id/imgStep2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:layout_marginTop="15dp"
android:src="@drawable/menu_ipo" />
</RelativeLayout>
</android.support.v7.widget.CardView>
<View
android:layout_width="1dp"
android:layout_height="25dp"
android:layout_gravity="right"
android:layout_marginRight="40dp"
android:background="#666" />
<android.support.v7.widget.CardView
android:id="@+id/cardStep3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:foreground="?android:attr/selectableItemBackground"
app:cardBackgroundColor="@color/white"
card_view:cardCornerRadius="@dimen/dimen_2"
card_view:cardElevation="@dimen/dimen_2"
card_view:cardUseCompatPadding="true" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<View
android:layout_width="4dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/step_three_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepThree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text="@string/lbl_step_three"
android:textColor="@color/step_three_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepThreeDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblStepThree"
android:layout_alignStart="@+id/lblStepThree"
android:layout_below="@+id/lblStepThree"
android:layout_marginTop="5dp"
android:text="@string/lbl_step_three_details"
android:textColor="@color/txt_black" />
<ImageView
android:id="@+id/imgStep3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:layout_marginTop="15dp"
android:src="@drawable/menu_ipo" />
</RelativeLayout>
</android.support.v7.widget.CardView>
<View
android:layout_width="1dp"
android:layout_height="25dp"
android:layout_gravity="right"
android:layout_marginRight="40dp"
android:background="#666" />
<android.support.v7.widget.CardView
android:id="@+id/cardStep4"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:foreground="?android:attr/selectableItemBackground"
app:cardBackgroundColor="@color/white"
card_view:cardCornerRadius="@dimen/dimen_2"
card_view:cardElevation="@dimen/dimen_2"
card_view:cardUseCompatPadding="true" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<View
android:layout_width="4dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/step_four_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepFour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text="@string/lbl_step_four"
android:textColor="@color/step_four_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepFourDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblStepFour"
android:layout_alignStart="@+id/lblStepFour"
android:layout_below="@+id/lblStepFour"
android:layout_marginTop="5dp"
android:text="@string/lbl_step_four_details"
android:textColor="@color/txt_black" />
<ImageView
android:id="@+id/imgStep4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:layout_marginTop="15dp"
android:src="@drawable/menu_ipo" />
</RelativeLayout>
</android.support.v7.widget.CardView>
<View
android:layout_width="1dp"
android:layout_height="25dp"
android:layout_gravity="right"
android:layout_marginRight="40dp"
android:background="#666" />
<android.support.v7.widget.CardView
android:id="@+id/cardStep5"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="25dp"
android:layout_weight="1"
android:foreground="?android:attr/selectableItemBackground"
app:cardBackgroundColor="@color/white"
card_view:cardCornerRadius="@dimen/dimen_2"
card_view:cardElevation="@dimen/dimen_2"
card_view:cardUseCompatPadding="true" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<View
android:layout_width="4dp"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="@color/step_five_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepFive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text="@string/lbl_step_five"
android:textColor="@color/step_five_view" />
<com.widgets.TextViewRobotoLight
android:id="@+id/lblStepFiveDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblStepFive"
android:layout_alignStart="@+id/lblStepFive"
android:layout_below="@+id/lblStepFive"
android:layout_marginTop="5dp"
android:text="@string/lbl_step_five_details"
android:textColor="@color/txt_black" />
<ImageView
android:id="@+id/imgStep5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:layout_marginTop="15dp"
android:src="@drawable/menu_ipo" />
</RelativeLayout>
</android.support.v7.widget.CardView>
<com.widgets.RobotoRegularButton
android:id="@+id/buttonPayIn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_fp_next_button"
android:text="@string/btn_get_started"
android:textAlignment="center"
android:textAllCaps="true"
android:textColor="@color/color_primary_text_color_fivep"
android:textSize="16sp" />
</LinearLayout>