【发布时间】:2019-02-24 06:52:19
【问题描述】:
我从另一个开发人员那里继承了下面的代码,它向外部系统发出请求。
我使用不同的“方法”参数值(来自 BackgroundWorker)调用 GenerateRequest 方法,所有这些都可以正常工作。然后当我进行第二次调用时,它仍然适用于除一个“方法”值之外的所有值(它还包含“参数”值的不同值,我将在下面也包括调用),它挂在 StreamReader ReadLine( ) 称呼。但是,如果我在允许 10-20 秒的时间内调试并逐步执行代码,输出会显示一些“线程 0xd0f0 已退出,代码为 0 (0x0)”的消息,然后代码就可以工作了。
我觉得我正在执行这项工作的线程有问题,但我无法弄清楚,请帮助。
这每次都有效;
ClientParameters parameters = new ClientParameters();
string request = requestHandler.GenerateRequest("GetFunctions", parameters);
这仅在第一次有效,除非我调试并逐步执行,让线程有时间退出。
ClientParameters parameters = new ClientParameters();
parameters.Filter = new ClientParametersFilter();
parameters.Filter.Demographics = "";
parameters.Filter.Medication = "";
parameters.Filter.MinEffectiveDate = DateTime.Now;
parameters.Filter.MaxEffectiveDate = DateTime.MaxValue;
string request = null;
try
{
request = requestHandler.GenerateRequest("GetRecord", parameters);
}
catch(Exception e)
{
// log error
return null;
}
Hear 是发出请求的类;
public class MyRequestHandler : IRequestHandler{
public string GenerateRequest(string method, ClientParameters parameters)
{
ClientIntegrationRequest request = new ClientIntegrationRequest();
request.APIKey = ApplicationSettings.APIKey;
request.Function = method;
request.FunctionVersion = 1.0M;
request.RequestUID = DateTime.Now.ToString();
request.DeviceID = ApplicationSettings.DeviceId;
request.DeviceVersion = ApplicationSettings.DeviceVersion;
request.FunctionParameters = parameters;
XmlSerializer ser = new XmlSerializer(typeof(ClientIntegrationRequest));
string xml;
using (MemoryStream m = new MemoryStream())
{
ser.Serialize(m, request);
// reset to 0
m.Position = 0;
xml = new StreamReader(m).ReadToEnd();
}
try
{
TcpClient tcpClient = new TcpClient("127.0.0.1", ApplicationSettings.Port);
NetworkStream netStream = tcpClient.GetStream();
if (netStream.CanWrite)
{
xml = xml + "\n";
Byte[] sendBytes = Encoding.UTF8.GetBytes(xml);
netStream.Write(sendBytes, 0, sendBytes.Length);
netStream.Flush();
}
else
{
tcpClient.Close();
netStream.Close();
return null;
}
netStream = tcpClient.GetStream();
if (netStream.CanRead)
{
StreamReader l_textReader = new StreamReader(netStream);
string str = l_textReader.ReadLine(); // Here's the issue
l_textReader.Close();
tcpClient.Close();
netStream.Close();
return str.ToString();
}
else
{
tcpClient.Close();
netStream.Close();
return null;
}
}
catch (SocketException e)
{
// log error
return null;
}
catch (Exception e)
{
// log error
return null;
}
}}
【问题讨论】:
标签: c# backgroundworker tcpclient streamreader