C#Thread.Sleep()

时间:2015-08-19 07:32:45

标签: c# multithreading

我需要以某种方式绕过Thread.Sleep()方法并且不要阻止我的UI线程,但我不必删除该方法。

我需要在不删除Sleep方法的情况下解决问题。 Sleep方法模拟延迟(无响应的应用程序)。我需要处理它。

3 个答案:

答案 0 :(得分:1)

如果应用程序未抽取其消息队列,则认为该应用程序无响应。 Winforms中的消息队列是在GUI线程上提取的。因此,为了使您的应用程序“响应”,您需要确保GUI线程有机会抽取消息队列 - 换句话说,它不能运行您的代码。

您提到Thread.Sleep模拟了您正在进行的某些操作中的“延迟”。但是,您需要考虑这种“延迟”的两个主要原因:

  • 等待完成的I / O请求(读取文件,查询数据库,发送HTTP请求......)
  • CPU工作

两者有不同的解决方案。如果您正在处理I / O,最好的方法通常是切换到使用异步I / O.使用await

轻而易举
var response = await new HttpClient().GetAsync("http://www.google.com/");

这确保您的GUI线程可以在您的请求处于挂起状态时完成其工作,并且您的代码将在响应返回后恢复到UI线程。

第二个主要通过多线程解决。在使用多线程时,您应该格外小心,因为它会增加您在单线程模型中无法获得的许多复杂性。正确处理多线程的最简单方法是确保您不访问任何共享状态 - 这就是需要进行同步的地方。再次,使用await,这是一件轻而易举的事情:

var someData = "Very important data";

var result = await Task.Run(() => RunComplexComputation(someData));

同样,计算将在您的UI线程之外运行,但是一旦完成并且GUI线程再次空闲,您的代码执行将在UI线程上恢复,并获得正确的结果。

答案 1 :(得分:0)

使用MultiThreading

使用不同的线程进行睡眠而不是主GUI线程。这样它就不会干扰您的主应用程序

答案 2 :(得分:0)

这样的事可能吗?

<api xmlns="http://ws.apache.org/ns/synapse" name="plantsapi" context="/plantsapi">
<resource methods="POST DELETE PUT GET">
  <inSequence>
     <log level="custom">
        <property name="Message Flow" value="Plant Search API API - IN"></property>
        <property name="HTTP_METHOD IS###########" expression="$axis2:HTTP_METHOD"></property>
        <property name="ip address" expression="get-property('axis2','REMOTE_ADDR')"></property>
        <property name="In Time : " expression="get-property('SYSTEM_TIME')"></property>
     </log>
     <property name="TIME_IN" expression="get-property('SYSTEM_TIME')" scope="default" type="LONG"></property>
     <property name="xacml_use_rest" value="true" scope="axis2" type="STRING"></property>
     <property name="xacml_resource_prefix" value="/SearchService/api/plants" scope="axis2"></property>
     <property name="xacml_resource_prefix_only" value="true" scope="axis2"></property>
     <entitlementService remoteServiceUrl="https://172.20.13.153:9443/services" remoteServiceUserName="admin" remoteServicePassword="enc:kuv2MubUUveMyv6GeHrXr9il59ajJIqUI4eoYHcgGKf/BBFOWn96NTjJQI+wYbWjKW6r79S7L7ZzgYeWx7DlGbff5X3pBN2Gh9yV0BHP1E93QtFqR7uTWi141Tr7V7ZwScwNqJbiNoV+vyLbsqKJE7T3nP8Ih9Y6omygbcLcHzg=" callbackClass="org.wso2.carbon.identity.entitlement.mediator.callback.UTEntitlementCallbackHandler" client="basicAuth">
        <onReject>
           <log level="custom">
              <property name="Message Flow" value="REJECTED@"></property>
           </log>
           <property name="HTTP_SC" value="401" scope="axis2" type="STRING"></property>
           <payloadFactory media-type="xml">
              <format>
                 <oatherizationresponse xmlns="">Not Authorized </oatherizationresponse>
              </format>
              <args></args>
           </payloadFactory>
           <respond></respond>
        </onReject>
        <onAccept>
           <log level="custom">
              <property name="Message Flow" value="ACCEPTED@"></property>
           </log>
           <send>
              <endpoint>
                 <address uri="http://172.20.13.153:8080/plant-service/api/"></address>
              </endpoint>
           </send>
           <property name="TIME_OUT" expression="get-property('SYSTEM_TIME')" scope="default" type="LONG"></property>
           <script language="js">var time1 = mc.getProperty("TIME_IN");var time2 = mc.getProperty("TIME_OUT");var timeTaken = time2 - time1;mc.setProperty("RESPONSE_TIME", timeTaken);</script>
           <log level="custom">
              <property name="Time Duration in ms:" expression="get-property('RESPONSE_TIME') "></property>
           </log>
        </onAccept>
        <obligations></obligations>
        <advice></advice>
     </entitlementService>
  </inSequence>
</resource>
<handlers>
     <handler class="org.wso2.handler.SimpleOauthHandlerNew">
  </handler>
</handlers>
</api>

如果由于逃避我的原因,您必须使用Thread.Sleep,您可以像这样处理它:

public async void Sleep(int milliseconds)
{
    // your code

    await Task.Delay(milliseconds); // non-blocking sleep

    // your code
}