Wem es betrifft. WCF-Client-Basis kann Thread-sicher sein, zumindest in dieser Konfiguration. Ich habe keine anderen Konfigurationen ausprobiert.
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IWcfCallbacksContract), Namespace = "http://wcf.applicatin.srv/namespace")]
public interface IWcfContract
{
[OperationContract]
CompositeReturnObject GetServerObject();
}
Service:
public CompositeReturnObject GetServerObject()
{
CompositeReturnObject ret = new CompositeReturnObject("Hello");
Thread.Sleep(10000); // Simulating long call
return ret;
}
Auftraggeber:
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;
}
);
}
und Ergebnis:
Aufgabe 1 Start: 15.47.08
Aufgabe 2 Beginn: 15 : 47: 10
Aufgabe 1 Oberfläche: 15.47.18
Name: Objekt ein "Hallo"
Aufgabe 2 Oberfläche: 15.47.20
Name: "Hallo" ein
Objekt Was ist Ihr Beweis oder Grund zu sagen, dass es Thread-sicher ist? Ich frage, weil das Ende [der ClientBase-Klasse auf MSDN] (http://msdn.microsoft.com/en-us/library/ms576141%28v=vs.110%29.aspx) es sagt, dass es nicht ist fadensicher. – ChrisW
@ChrisW: Das bedeutet wahrscheinlich, dass der Zugriff auf Eigenschaften von 'ClientBase' nicht Thread-sicher ist, aber der Aufruf zum Dienst ist (oder es kann ein Fehler in der Dokumentation sein - das ist nicht so selten). Zunächst einmal können Sie ohne Kundenbasis telefonieren - Sie brauchen nur einen Kanal. Ich habe keine Beweise. Ich glaube nur, dass das Anrufen von Remotediensten keine globalen gemeinsamen Daten speichern muss - ansonsten wäre die gesamte Clientseite von WCF schrecklich schlecht gestaltet. –
Ist der innere "Kanal" als threadsicher bekannt? Ich stelle mir vor, dass ein Kanal einige Speicherpuffer und einen Netzwerk-Socket besitzt; und dass, es sei denn, dass es explizit entworfen wurde, um gleichzeitige Benutzer zu unterstützen (z. B. durch Sequenzieren ihrer Anforderungen), es katastrophal wäre, wenn zwei versuchen, gleichzeitig in den Speicher und den Socket zu schreiben. – ChrisW