如何确保Task.Delay更准确?

时间:2015-06-29 22:16:50

标签: c# wpf multithreading asynchronous async-await

我有一个WPF应用程序,它广泛使用awaitasync方法。我可以在几个地方呼叫await Task.Delay(...);来插入暂停。但是我遇到的麻烦是虽然很多这些停顿都可以稍微偏离,但有些地方我绝对需要暂停才能准确。换句话说,如果我调用await Task.Delay(2000);,我的应用程序中有一些地方需要保证它只会暂停2秒(而不是2.2秒)。

我认为麻烦来自这样一个事实:我确实有很多不同的异步方法,所以当我告诉其中一个延迟时,线程池中没有足够的线程当它应该返回时活着,无意间造成比预期更长的延误。

如果您的业务需求尽可能准确,那么线程的C#“最佳做法”是什么?很明显,异步方法似乎并不足够(即使它们很好阅读)。我应该手动创建具有更高优先级的线程并使用Thread.Sleep吗?我是否增加线程池中的线程数?我使用的是BackgroundWorker吗?

2 个答案:

答案 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>