我需要以某种方式绕过Thread.Sleep()
方法并且不要阻止我的UI线程,但我不必删除该方法。
我需要在不删除Sleep方法的情况下解决问题。 Sleep方法模拟延迟(无响应的应用程序)。我需要处理它。
答案 0 :(得分:1)
如果应用程序未抽取其消息队列,则认为该应用程序无响应。 Winforms中的消息队列是在GUI线程上提取的。因此,为了使您的应用程序“响应”,您需要确保GUI线程有机会抽取消息队列 - 换句话说,它不能运行您的代码。
您提到Thread.Sleep
模拟了您正在进行的某些操作中的“延迟”。但是,您需要考虑这种“延迟”的两个主要原因:
两者有不同的解决方案。如果您正在处理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)
使用不同的线程进行睡眠而不是主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
}