|
Thanks! I tried it out but problem is still there
cout << "\0";
// its backSlashZero
|
|
|
|
|
Are you doing the following in OnStart()?
timer.Enabled = true;
timer.Start();
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Yes i did!
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart: Calling web service for Sending Reminders on "
+ DateTime.Now.ToLongDateString());
EmailObj.SendReminder(); \\send reminders if any!
timer.Enabled = true;
timer.Start();
}
cout << "\0";
// its backSlashZero
|
|
|
|
|
DropDownList ddlst = new DropDownList();
ddlst = (DropDownList)e.Item.Cells[1].FindControl("eddpgmtype");
Object cobj = new Object();
objArrEntity = cobj.type_bind();
ddlst.DataSource = objArrEntity;
ddlst.DataTextField = "type";
ddlst.DataValueField = "ID";
ddlst.DataBind();
ddlst.SelectedItem.Text = e.Item.Cells[11].Text.ToString();
in cells[11] i have a hidden column of "type"
this is my code for binding data to dropdown when edit command is clicked.
actually dropdown consists of inbound,outbound,backoffice
the first record consits of programtype 'outbound' in datagrid
when i click edit i should able to see this outbound in dropdownlist as first item as well as list items of main dropdown(inbound,outbound,backoffice).but this inbound is getting overwritten by outbound.
i think question is clear
plz help me in binding the data as mentioned above.
Thank u
|
|
|
|
|
Hello everyone,
Here is my simple application code for a Windows Service application. The question is, when stop the service, there is always,
// [System.InvalidOperationException] = {"Please call the Start() method before calling this method."}
Does anyone have any ideas why there is such issue and how to fix?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Net;
using System.Threading;
namespace TestServiceStop1
{
public partial class Service1 : ServiceBase
{
private Thread _tHttpThread;
private TestHttpServer _server;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_server = new TestHttpServer(this);
_tHttpThread = new Thread(_server.StartListen);
_tHttpThread.Start();
}
protected override void OnStop()
{
_server.Stop(false);
}
}
public class TestHttpServer
{
private int _Port = 0;
private HttpListener _Server = new HttpListener();
private Service1 _manager;
public TestHttpServer (Service1 manager)
{
_manager = manager;
}
public int ListenPort
{
get
{
return _Port;
}
set
{
_Port = value;
}
}
public void StartListen()
{
try
{
IAsyncResult result;
_Server.Prefixes.Add(String.Format("http://+:{0}/", 9099));
_Server.Start();
while (true)
{
result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server);
result.AsyncWaitHandle.WaitOne();
}
}
catch (Exception ex)
{
throw ex;
}
}
public void Stop(bool isTerminate)
{
_Server.Stop();
}
private void HttpCallback(IAsyncResult result)
{
HttpListenerContext context = _Server.EndGetContext(result);
HandleRequest(context);
}
private void HandleRequest(HttpListenerContext context)
{
string matchUrl = context.Request.Url.AbsolutePath.Trim().ToLower();
context.Response.StatusCode = 200;
context.Response.StatusDescription = "OK";
context.Response.Close();
}
}
}
thanks in advance,
George
|
|
|
|
|
George_George wrote: _Server.Stop();
I can't find where you are stopping the thread. You are just stopping the HTTPListener, not the thread. OnStop() method should be able to exit the thread also, I guess. Not sure this will be the reason for error.
|
|
|
|
|
Sorry N a v a n e e t h,
My English is not very good. You mean I need to stop the thread tHttpThread in OnStop?
regards,
George
|
|
|
|
|
George_George wrote: You mean I need to stop the thread tHttpThread in OnStop?
Yes. The thread is not stopping in your code. Stop that on OnStop() method.
|
|
|
|
|
Thanks N a v a n e e t h,
How to stop the thread gracefully? I think of using Abort, but we have discussed before this method call is not a good idea always.
regards,
George
|
|
|
|
|
Go with this[^]. It will work.
|
|
|
|
|
Actually because the BeginGetContext call will throw an exception when the _Server object is stopped, the thread will stop too so no extra work is actually required.
|
|
|
|
|
I mean the thread which he created.
|
|
|
|
|
I know which thread you mean.
The thread he creates uses the StartListening Function. In that function the BeginGetContext call is made, and this will throw the InvalidOperationException when the _Server object is stopped. So the thread he creates really does exit when the _Server stops. He will just need to catch the InvalidOperationException and evaluate that it is expected behaviour.
|
|
|
|
|
Thanks GDavy!
If I fixed in this way, are there any need to stop the tHttpThread thread?
while (true)
{
if (_Server.IsListening)
{
result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _server);
result.AsyncWaitHandle.WaitOne();
}
else
{
break;
}
}
regards,
George
|
|
|
|
|
GDavy wrote: In that function the BeginGetContext call is made, and this will throw the InvalidOperationException when the _Server object is stopped. So the thread he creates really does exit when the _Server stops. He will just need to catch the InvalidOperationException
I know. I was suggesting him to stop that thread when HTTPListener stops, so it won't call again BeginGetContext() . Will that be a good method than catching exception, and thread getting aborted automatically ?
|
|
|
|
|
|
1 -
volatile bool continue = true;
public void StartListen()
{
try
{
IAsyncResult result;
_Server.Prefixes.Add(String.Format("http://+:{0}/", 9099));
_Server.Start();
while (continue)
{
result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server);
result.AsyncWaitHandle.WaitOne();
}
}
catch (Exception ex)
{
throw ex;
}
}
public void Stop(bool isTerminate)
{
continue = false;
_Server.Stop();
}
2 - It looks fine.
|
|
|
|
|
Thanks N a v a n e e t h,
I think your code has an issue when we are executing result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server) while at the same time, Stop is called.
In this situation, there is no chance to check continue status variable. Any comments?
regards,
George
|
|
|
|
|
Yes you are correct. I wrote it to explain the things, and don't consider it as a final code. Try with some synchronization mechanism, or the other method which GDavy suggested, it's looking good.
|
|
|
|
|
Thanks N a v a n e e t h,
Using synchronization in service stop callback method OnStop is dangerous, right?
If I do not understand your points correctly, please feel free to correct me and post your code.
regards,
George
|
|
|
|
|
George_George wrote: result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server) while at the same time, Stop is called. [Smile]
George - I was trying to solve the quoted issue. When I looked into your code carefully, I am confused. Your HTTPServer can connect only one client at a time ?
|
|
|
|
|
Thanks N a v a n e e t h,
1.
I have checked multiple clients can enter HandleRequest when we call EndGetContext. Please feel free to correct me if I am wrong.
2.
If you have any ideas to improve my code to handle clients' request more efficiently?
regards,
George
|
|
|
|
|
Ok- Take a look at your StartListen() method (unwanted lines trimmed).
public void StartListen()
{
IAsyncResult result;
_Server.Start();
while (true)
{
result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server);
result.AsyncWaitHandle.WaitOne();
}
}
Consider the following situation
1 - Loop starts for the first time, value of result will be NULL initially.
2 - It calls _Server.BeginGetContext , asynchronous method call starts and return immediatly.
3 - You call WaitOne() which blocks the loop, so it will wait until the processing finishes.
4 - When processing finishes it waits for next one.
So what will happen if another request comes during the execution of previous one ? It will be blocked in this case. Correct ?
|
|
|
|
|
Thanks N a v a n e e t h,
When I call EndGetContext, the server is able to process another request, while at the same time, in method HandleRequest, we can retrive input stream and output stream of Http Request from parameter HttpListenerContext context, so that at the same time of waiting for another incoming request, we can read content of request from input stream and processing, then write output to the output stream.
Please feel free to correct me if I am wrong. Also, if you have any ideas to improve, I am happy to learn from you.
regards,
George
|
|
|
|
|
George_George wrote: When I call EndGetContext, the server is able to process another request
yes, it will be able to process other request only at that time. So all the requests came when it executes, has to wait. Other problem I find here is, the IAsyncResult instance is shared, I mean it will be overwritten each time a request occurs. This is not a good idea. One IAsyncResult instance should represent one request, Right ?
Looks like you need to refactor this. Consider a design where each request will have it's own IAsyncResult instance. I guess that should solve the problem
|
|
|
|