문제
작업이 잘못되면 타이머를 시작하고 30 초를 기다리고 타이머를 멈추고 작업을 다시 시도하는 페이지가 있습니다. 타이머가 시작될 때마다 레이블의 텍스트를 변경하여 사용자에게 정보를 제공해야합니다.
어떻게하니?
해결책
내가 올바르게 이해하면 대신 클라이언트 측 (JavaScript) 타이머를 사용해야한다고 생각합니다. 이를 위해 서버 측 타이머를 사용할 수 없습니다.
오류 조건을 감지하면 레이블을 그에 따라 업데이트하여 사용자에게 표시합니다. 동시에 30 초 후에 포스트백이되는 클라이언트 측 타이머를 호출합니다.
예를 들어 다음 타이머 코드를 페이지에 넣습니다.
<script>
function StartTimer()
{
setTimeout('DoPostBack()', 30000); // call DoPostBack in 30 seconds
}
function DoPostBack()
{
__doPostBack(); // invoke the postback
}
</script>
오류 조건의 경우 클라이언트 측 타이머가 시작되어야합니다.
if (error.Code == tooManyClientsErrorCode)
{
// add some javascript that will call StartTimer() on the client
ClientScript.RegisterClientScriptBlock(this.GetType(), "timer", "StartTimer();", true);
//...
}
이것이 도움이되기를 바랍니다 (현재 시각적 스튜디오가 없기 때문에 코드가 테스트되지 않았습니다).
업데이트:
버튼 클릭을 "시뮬레이션"하려면 버튼의 클라이언트 ID로 __dopostback () 메소드로 전달해야합니다.
function DoPostBack()
{
var buttonClientId = '<%= myButton.ClientID %>';
__doPostBack(buttonClientId, ''); // simulate a button click
}
다른 가능성은 다음 질문/답변을 참조하십시오.
다른 팁
클라이언트 측에서 포스트 백 강제로 __dopostback 방법을 직접 호출 할 수 있습니다.
이벤트 타겟과 이벤트 어 구역의 두 가지 주장이 필요합니다. 일반 ASP.NET주기 외부 에서이 호출을하고 있으므로 페이지로드 이벤트 (또는 초기, 선택)에서 ISPOSTBACK을 확인해야합니다. 양식 요소로 UP (request.form [ "__ EventTarget"]). 값을 확인하여 Postback이 전화 나 다른 컨트롤 중 하나에서 왔는지 확인하십시오. 해당의 가치가 클라이언트 측에서 전달 된 내용과 일치하는 경우 라벨 테스트로 변경하십시오.
이 작업을 수행하는 두 가지 방법은 동일한 스레드에서 다른 기능을 호출 해야하는 경우 조금 더 좋습니다. ScriptManager와 타이머를 ASPX 페이지에 추가하면 Toolbox에서 삭제하거나 코드를 입력 할 수 있습니다. ScriptManager는 ASP : 타이머 전에 선언해야합니다. 간격마다 발사됩니다.
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Timer ID="Timer1" runat="server" Interval="4000" OnTick="Timer1_Tick">
</asp:Timer>
뒤에있는 코드 (이 경우 C#)에서 :
protected void Timer1_Tick(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine("tick tock");
}
두 번째 방법은 같은 스레드에서 발사 할 기능이 필요하다면 좋지 않습니다. C#을 사용하여 ASP.NET에서 타이머를 수행 할 수 있습니다. 다음 코드는 2 초마다 함수를 시작합니다. 뒤의 코드 (.CS) 파일에서 :
// timer variable
private static System.Timers.Timer aTimer;
protected void Page_Load(object sender, EventArgs e)
{
// Create a timer and set a two second interval.
aTimer = new System.Timers.Timer();
aTimer.Interval = 2000;
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
aTimer.AutoReset = true;
// Start the timer
aTimer.Enabled = true;
}
그런 다음 호출하려는 기능을이 형식으로 만드십시오.
//Doesn't need to be static if calling other non static functions
private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
샘플 출력 :