我有一個應用程序(UWP - Win10)和一個Windows服務。等待服務任務獲取TaskCanceledException:任務被取消
服務在後臺運行,它們都是用C#開發的。 「callAsync」是服務的方法。我正在等待在客戶端上調用它。
var obj = await callAsync(10);
的問題是: 如果該調用需要不到1min40s(100秒)時,那麼一切工作正常。但是,如果它需要超過1分40秒,則會發生異常「TaskCanceledException:任務被取消」。
我有搜索和網頁,但仍無法找到任何跡象表明如何解決這個「超時」問題。我在應用程序和服務app.config中添加了所有「打開/關閉/接收/發送」超時標誌,雖然在這種情況下引發的異常是不同的。
如果我嘗試在客戶端簡單的延遲:
await Task.delay(200000);
它工作正常。
該服務是通過VS2015「添加服務參考」添加的。我也「附加」到服務器,並且服務器繼續運行並在日誌前後在控制檯中打印(以確認一切正常)。
我缺少什麼?什麼配置和哪裏需要改變,這樣任務可以運行超過1分40秒?
CODE:
服務器僞代碼示例:
接口文件:
[ServiceContract(Namespace="http://.....")]
interface ICom {
[OperationContract]
int call(int val);
}
Service.cs
public ServiceHost serviceHost = null;
public BlaBlaWindowsService()
{
ServiceName = "BlaBlaWindowsService";
}
public static void Main()
{
ServiceBase.Run(new BlaBlaWindowsService());
}
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
serviceHost = new ServiceHost(typeof(BlaBlaService));
serviceHost.Open();
}
protected override void OnStop()
{
if (serviceHost != null)
{
serviceHost.Close();
serviceHost = null;
}
}
}
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public ProjectInstaller()
{
process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();
service.ServiceName = "BlaBlaWindowsService";
Installers.Add(process);
Installers.Add(service);
}
}
個
BlaBlaService.cs
class TPAService : ITPAComunication {
public int call(int val) {
System.Threading.Thread.Sleep(200000)
return 0;
}
}
App.config文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<binding name="ServiceTimeout" closeTimeout="00:10:00" receiveTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00"/>
</bindings>
<services>
<service name="BlaBla.Service.Service"
behaviorConfiguration="ServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/BlaBla/service"/>
</baseAddresses>
</host>
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="ServiceTimeout"
contract="BlaBla.Service.ICom" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
的應用程序的僞代碼示例:
System.ServiceModel.EndpointAddress epa = new System.ServiceModel.EndpointAddress("http://localhost:8000/blabla/service");
System.ServiceModel.BasicHttpBinding bhb = new System.ServiceModel.BasicHttpBinding();
Timespan t = new TimeSpan(0, 10, 0);
bhb.SendTimeout = t; bhb.ReceiveTimeout =t; bhb.OpenTimeout = t; bhb.CloseTimeout = t;
Blabla.ComunicationClient com = new Blabla.ComunicationClient(bhb, epa);
var obj = await com.callAsync(int val);
return obj;
UPDATE#1
這種情況只發生在UWP中。我創建了一個類似的WinForms項目,一切都按預期工作。這意味着它可能與UWP有關。
這可能是因爲Web請求超時而發生的: https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout%28v=vs.110%29.aspx? f = 255&MSPPError = -2147217396 – Bas
@Bas感謝您的評論,但一個超時(根據您剛纔鏈接的文檔,拋出一個WebException。我提到的情況拋出一個TaskCanceledException。(在鏈接的文檔中:「如果在超時期限內沒有返回資源,請求會拋出WebException」) – nunofmendes