На мой взгляд, и в соответствии с тем, что делает ваш пример, похоже, вам просто нужно получить результаты Task
в пространстве, доступном для вашего экземпляра службы.
Моя упрощенная версия имеет свойство в контракте на обслуживание и реализации:
[ServiceContract]
public interface IService
{
// not exposed
byte[] TaskResults { get; set; }
[OperationContract]
byte[] GetData();
}
public class Service : IService
{
public byte[] TaskResults { get; set; }
public byte[] GetData()
{
//byte[] result = new byte[5000];
//return result;
return TaskResults;
}
}
А затем измените подпись ScreenLogger.Start()
на ScreenLogger.Start(Action<byte[]> bytesAction)
, вызывая это действие с результатами работы задачи.
public void Start(Action<byte[]> bytesAction)
{
var imageTask = Task.Factory.StartNew(() =>
{
//var GeneratedBytes = GenerateImage();
//How to send GeneratedBytes to client?
bytesAction(GenerateImage());
});
}
И, наконец, передача действия, которое присваивает результаты задачи свойству службы.
static void Main(string[] args)
{
ScreenLogger screenLogger = new ScreenLogger();
ServiceHost host = new ServiceHost(typeof(Service));
screenLogger.Start(ba => ((Service)host.SingletonInstance).TaskResults = ba);
host.AddServiceEndpoint(typeof(IService), new NetTcpBinding(), new Uri(@"net.tcp://localhost:8554/"));
Console.WriteLine("Server start");
host.Open();
Console.ReadLine();
host.Close();
}
Код клиента (упрощенный) выглядит следующим образом.
public class ViewModel
{
private string bytesSum;
public string BytesSum
{
get { return bytesSum; }
set { bytesSum = value; this.NotifyPropertyChanged("BytesSum"); }
}
public ViewModel()
{
ChannelFactory<IService> channel = new ChannelFactory<IService>(new NetTcpBinding(), new EndpointAddress(@"net.tcp://localhost:8554/"));
IService s = channel.CreateChannel();
//How to get data from server and update UI?
s.GetData().ToList().ForEach(b => Console.Write(b));
}
private void NotifyPropertyChanged(String propertyName = "")
{
}
}