A chi può interessare. La base del client WCF può essere thread-safe, almeno in questa configurazione. Non ho provato altre configurazioni.
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IWcfCallbacksContract), Namespace = "http://wcf.applicatin.srv/namespace")]
public interface IWcfContract
{
[OperationContract]
CompositeReturnObject GetServerObject();
}
Servizio:
public CompositeReturnObject GetServerObject()
{
CompositeReturnObject ret = new CompositeReturnObject("Hello");
Thread.Sleep(10000); // Simulating long call
return ret;
}
Cliente:
private void GetData_Click(object sender, RoutedEventArgs e)
{
Console.WriteLine("Task 1 start: " + DateTime.Now.ToString("HH:mm:ss"));
Task.Factory.StartNew(() => {
var res = _proxy.GetServerObject();
Console.WriteLine("Task 1 finish: " + DateTime.Now.ToString("HH:mm:s"));
Console.WriteLine(res.ToString());
return;
}
);
Thread.Sleep(2000);
Console.WriteLine("Task 2 start: " + DateTime.Now.ToString("HH:mm:ss"));
Task.Factory.StartNew(() => {
var res = _proxy.GetServerObject();
Console.WriteLine("Task 2 finish: " + DateTime.Now.ToString("HH:mm:s"));
Console.WriteLine(res.ToString());
return;
}
);
}
E risultato:
Task 1 inizio: 15:47:08
Task 2 inizio: 15 : 47: 10
Task 1 finitura: 15:47:18
Nome: oggetto "Ciao"
Task 2 finitura: 15:47:20
Nome: oggetto "Ciao"
fonte
2017-12-28 15:07:03
Che cosa è la tua prova o ragione per dire che è thread-safe? Sto chiedendo perché la fine della [classe ClientBase su MSDN] (http://msdn.microsoft.com/en-us/library/ms576141%28v=vs.110%29.aspx) dice che non è thread-safe. – ChrisW
@ChrisW: Questo probabilmente significa che l'accesso alle proprietà di 'ClientBase' non è thread-safe ma la chiamata al servizio è (o può essere un bug nella documentazione - che non è così raro). Prima di tutto è possibile effettuare una chiamata senza base client - è sufficiente un canale. Non ho alcuna prova. Credo solo che chiamare il servizio remoto non abbia bisogno di memorizzare alcun dato globale condiviso - altrimenti l'intero lato client di WCF sarebbe terribilmente mal progettato. –
Il "canale" interno è noto per essere thread-safe? Immagino che un canale possieda alcuni buffer di memoria e un socket di rete; e che, a meno che non sia progettato esplicitamente per supportare utenti concorrenti (ad esempio sequenziando le loro richieste), sarebbe disastroso se due provassero a scrivere contemporaneamente nella memoria e nel socket. – ChrisW