System.Threading.Timer funktioniert nicht als Release

19/09/2007 - 07:28 von Woidda | Report spam
Hallo,
ich habe ein Problem mit dem System.Threading.Timer! Wenn ich das
Programm im Debugger laufen lasse, dann wird der Timer immer wieder
aufgerufen. Wenn ich aber eine Release - Exe erzeuge und normal startet,
dann wird der Timer nur ca. 11 mal aufgerufen. Was mach ich falsch?

Hier der Code:
<code>
/*
* Erstellt mit SharpDevelop.
* Benutzer: Woidda
* Datum: 19.09.2007
* Zeit: 06:02
*
* Sie können diese Vorlage unter Extras > Optionen > Codeerstellung >
Standardheader àndern.
*/
using System;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using System.IO;

namespace TimerTest
{
public sealed class NotificationIcon
{
private NotifyIcon notifyIcon;
private ContextMenu notificationMenu;

#region Initialize icon and menu
public NotificationIcon()
{
notifyIcon = new NotifyIcon();
notificationMenu = new ContextMenu(InitializeMenu());

notifyIcon.DoubleClick += IconDoubleClick;
System.ComponentModel.ComponentResourceManager resources new System.ComponentModel.ComponentResourceManager(
typeof(NotificationIcon));
notifyIcon.Icon = (Icon)resources.GetObject("$this.Icon");
notifyIcon.ContextMenu = notificationMenu;
}

private MenuItem[] InitializeMenu()
{
MenuItem[] menu = new MenuItem[] {
new MenuItem("About", menuAboutClick),
new MenuItem("Exit", menuExitClick)
};
return menu;
}
#endregion

#region Main - Program entry point
/// <summary>Program entry point.</summary>
/// <param name="args">Command Line Arguments</param>
[STAThread]
public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

bool isFirstInstance;
// Please use a unique name for the mutex to prevent conflicts with
// other programs
using (Mutex mtx = new Mutex(true, "TimerTest", out isFirstInstance))
{
if (isFirstInstance) {
NotificationIcon notificationIcon = new NotificationIcon();
notificationIcon.notifyIcon.Visible = true;

TimerEvent te = new TimerEvent();

TimerCallback tc = new TimerCallback(te.DoEvent);

System.Threading.Timer t = new System.Threading.Timer(
tc, null, 1000,1000);

Application.Run();
notificationIcon.notifyIcon.Dispose();
} else {
// The application is already running
// TODO: Display message box or change focus to existing
// application instance
}
} // releases the Mutex
}
#endregion

#region Event Handlers
private void menuAboutClick(object sender, EventArgs e)
{
MessageBox.Show("About This Application");
}

private void menuExitClick(object sender, EventArgs e)
{
Application.Exit();
}

private void IconDoubleClick(object sender, EventArgs e)
{
MessageBox.Show("The icon was double clicked");
}
#endregion
}

class TimerEvent
{
public void DoEvent(Object stateInfo)
{
StreamWriter sw = new StreamWriter(
new FileStream(".\\test.log",FileMode.Append,FileAccess.Write));
sw.WriteLine("{0}",DateTime.Now.ToString("s"));
sw.Close();
}
}
}</code>

Vielen Dank
Walter
 

Lesen sie die antworten

#1 Thomas Scheidegger [MVP]
19/09/2007 - 07:59 | Warnen spam
Hallo Walter

wird der Timer nur ca. 11 mal aufgerufen
TimerEvent te = new TimerEvent();
TimerCallback tc = new TimerCallback(te.DoEvent);



ein typischer Fall könnte sein, dass der GC gelegentlich deine 'te' Instanz entsorgt.
Also keine lokale Variable, sondern lege die 'te' Instanz irgendwo bestàndiger ab.



Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen