I am currently facing a damn weird problem on our production servers. Every now and then the default application pool crashes on the iis. After hours of investigating a finally isolated the problem and created a few lines of codes which reliably reproduces the problem:
public class DemoHttpHandler: IHttpHandler {
public void ProcessRequest (HttpContext Context) {
try {
Context.Response.End();
}
catch(ThreadAbortException) {
}
finally {
}
}
}
This sequence causes the following error:
An unhandled exception occurred and the process was terminated.
Application ID: /LM/W3SVC/1/ROOT/scs-testint
Process ID: 4752
Exception: System.Threading.ThreadAbortException
Message: Thread was being aborted.
StackTrace: at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
Leading to this error:
Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x5215df96
Faulting module name: KERNELBASE.dll, version: 6.3.9600.17415, time stamp: 0x54505737
Exception code: 0xe0434352
Fault offset: 0x0000000000008b9c
Faulting process id: 0x1290
Faulting application start time: 0x01d125da7b0fc43e
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: C:\Windows\system32\KERNELBASE.dll
Report Id: b9b1e16f-91cd-11e5-80db-00155d3c110b
Faulting package full name:
Faulting package-relative application ID:
If I remove the EMPTY??? finally block, everything works fine and the IIS doesn't crash anymore...
public class DemoHttpHandler: IHttpHandler {
public void ProcessRequest (HttpContext Context) {
try {
Context.Response.End();
}
catch(ThreadAbortException) {
}
}
}
Any ideas?
Related
I try to start my own Windows service on C# based.
I try to run with sc.exe create Service.exe but when I want to run this service I have bugs #1026 (Description: The process was terminated due to an unhandled exception.) and #1000. (Faulting application name: Timesync.exe, version: 1.0.0.0, time stamp: 0xf1683f8e
Faulting module name: KERNELBASE.dll, version: 10.0.22621.674, time stamp: 0x160a2aa8) Now I try to this service with InstallUtil.exe but we I can't. Because I have this error: Exception occurred while initializing the installation:
System.BadImageFormatException: Could not load file or assembly 'file:Service.exe' or one of its dependencies. The module was expected to contain an assembly manifest..
Here is my code:
Timer Schedular;
public Service1()
{
InitializeComponent();
if (!EventLog.SourceExists("Timesync"))
EventLog.CreateEventSource("Timesync", "TimesyncLog");
eventLog1.Source = "Timesync";
eventLog1.Log = "TimesyncLog";
}
protected override async void OnStart(string[] args)
{
System.Diagnostics.Debugger.Launch();
eventLog1.WriteEntry("Timesync was started", EventLogEntryType.Information);
await this.ScheduleService();
}
public void onDebug()
{
OnStart(null);
}
private async void SchedularCallback(object e)
{
await this.ScheduleService();
}
private async Task ScheduleService()
{
try
{
}
catch (Exception ex)
{
eventLog1.WriteEntry("Timesync was be here on catch state", EventLogEntryType.Information);
//Stop the Windows Service.
using (ServiceController serviceController = new ServiceController("Timesync"))
{
serviceController.Stop();
}
}
}
Program.cs
internal class Program
{
static void Main(string[] args)
{
//In Release this section is used. This is the "normal" way.
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
Console.WriteLine("The application was be here");
}
}
I can't understand how to resolve my bug and how to run this service.
If it possible, please help. :)
Any chance you are trying to use 32bit library in x64 solution or vice versa. I usually get badimageformat when I don't set Platform target in project build settings.
So if left on Any CPU and the system is x64, and if I use some dependent library which is 32bit. Service will try to run as x64 but fails because of this 32 library. So in our case solution is to set Platform target to x86.
I am not quite sure if this has been asked before but I have searched google but nothing much came up with this problem. I have 2 apps which are submitted to store and they both have almost same background tasks, specifically 2 tasks each.
I register the background tasks, when the app starts and if the app gets updated I check the app version and do things appropriately as described in Microsoft Documentation for UWP apps for Out-of-Process Background Tasks.
The background tasks were working fine before but for a number of days till now, I didn't see any activity regarding background tasks in my system. I checked the event viewer and I saw that according to the triggers defined in the apps the background tasks do "try to start" but there is some problem with the system when the Tasks get killed with exceptions and never actually run.
Please note that while Debugging I can surely run the background Tasks without any problems, the tasks don't run when they start on their own.
Following are the screenshots for event viewer latest logs:
Task 1 for WFW Movies & TV
Task 2 for WFW Movies & TV
Task 1 for Anime Deed
Task 2 for Anime Deed
The code I use for registration for tasks:
private static async void BackgroundTasksRegistrationProcedure()
{
string curVer = DataHelper.GetAppVersion();
TimeTrigger timeTrigger = new TimeTrigger(15, false);
SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
bool doRegister = false;
var status1 = await BackgroundExecutionManager.RequestAccessAsync();
switch (status1)
{
case BackgroundAccessStatus.DeniedByUser:
{
doRegister = false;
break;
}
case BackgroundAccessStatus.AllowedSubjectToSystemPolicy:
{
doRegister = true;
break;
}
case BackgroundAccessStatus.AlwaysAllowed:
{
doRegister = true;
break;
}
default:
break;
}
var versionKey = "app_version";
if (!DataHelper.LocalDataContainer.Values.ContainsKey(versionKey))
{
DataHelper.LocalDataContainer.Values[versionKey] = curVer;
// run tasks registration here
if (doRegister)
{
RegisterBackgroundTask(EpisodeUpdateTaskEntryPoint, EpisodeUpdateTaskName, new TimeTrigger(120, false), internetCondition);
RegisterBackgroundTask(TileUpdateTaskEntryPoint, TileUpdateTaskName, timeTrigger, internetCondition);
}
}
else
{
// compare app version
if (DataHelper.LocalDataContainer.Values[versionKey].ToString() == curVer)
{
// run tasks registration here
if (doRegister)
{
RegisterBackgroundTask(EpisodeUpdateTaskEntryPoint, EpisodeUpdateTaskName, new TimeTrigger(120, false), internetCondition);
RegisterBackgroundTask(TileUpdateTaskEntryPoint, TileUpdateTaskName, timeTrigger, internetCondition);
}
}
else
{
DataHelper.LocalDataContainer.Values[versionKey] = curVer;
// remove task registrations
BackgroundExecutionManager.RemoveAccess();
// run tasks registrations
await BackgroundExecutionManager.RequestAccessAsync();
if (doRegister)
{
RegisterBackgroundTask(EpisodeUpdateTaskEntryPoint, EpisodeUpdateTaskName, new TimeTrigger(120, false), internetCondition);
RegisterBackgroundTask(TileUpdateTaskEntryPoint, TileUpdateTaskName, timeTrigger, internetCondition);
}
}
}
}
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string name, IBackgroundTrigger trigger, IBackgroundCondition condition)
{
// We'll add code to this function in subsequent steps.
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == name)
{
//
// The task is already registered.
//
return (BackgroundTaskRegistration)(cur.Value);
}
}
var builder = new BackgroundTaskBuilder()
{
Name = name
};
// in-process background tasks don't set TaskEntryPoint
if (taskEntryPoint != null && taskEntryPoint != string.Empty)
{
builder.TaskEntryPoint = taskEntryPoint;
}
builder.SetTrigger(trigger);
if (condition != null)
{
builder.AddCondition(condition);
}
BackgroundTaskRegistration task = builder.Register();
return task;
}
Please help me understand why this is happening. I can Debug the tasks successfully but they don't run on their own when the app is not running. Thanks
Update:
I have found another error relating to BackgroundTaskHost.exe
Faulting application name: backgroundTaskHost.exe, version: 10.0.15063.0, time stamp: 0x9ad06afb
Faulting module name: CoreCLR.dll, version: 4.6.25129.1, time stamp: 0x58dc3e7d
Exception code: 0xc0000005
Fault offset: 0x0014101d
Faulting process ID: 0x18bc
Faulting application start time: 0x01d2d953c94d6e41
Faulting application path: C:\Windows\syswow64\backgroundTaskHost.exe
Faulting module path: C:\Program Files\WindowsApps\Microsoft.NET.CoreRuntime.1.1_1.1.25129.1_x86__8wekyb3d8bbwe\CoreCLR.dll
Report ID: 8a3a3035-d95b-49bb-a106-d645c604c39b
Faulting package full name: 51918AhmarAftab.WFWMoviesTV_1.3.442.0_x86__rm40d0p5knk1c
Faulting package-relative application ID: App
I think it's a windows issue considering the fault is in .Net.CoreRuntime.
The application exits with:
The program '[12868] AppName.vshost.exe' has exited with code 1073741855 (0x4000001f).
Below Code:
Call Export() twice after each other: crash with above logging
Call the contents of Export() inside Export() twice (the inner scope), and it doesn't crash.
This is reproducible, I have no idea where to start.
private void btnExport_Click(object sender, RoutedEventArgs e)
{
Enable(false);
statusbar.Message = "Exporting...";
Task t = new Task(Export);
t.ContinueWith(ExportEnd);
t.Start();
}
private void Export()
{
{
PBNSectionDictionary source = ctrlSectionSelection.SectionSelection.SelectSections;
PBNSectionDictionary dict = new PBNSectionDictionary();
foreach (string sectionType in source.Keys)
{
if (source[sectionType] != null)
{
dict[sectionType] = collector.ReadFullSection(source[sectionType]);
}
}
PBNFMV.Export.PBNExport export = new PBNFMV.Export.PBNExport(new Lms.Custom.Files.AdvancedFileLocator(Constants.NAME), dict, manager);
export.Export();
dict.Dispose();
}
}
private void ExportEnd(Task t)
{
Enable(true);
statusbar.Message = "Export done";
}
Event log:
Faulting application name: PBNFMV.exe, version: 16.2.0.0, time stamp: 0x58aeadf2
Faulting module name: ntdll.dll, version: 6.1.7601.23569, time stamp: 0x57f7bb79
Exception code: 0xc0000374
Fault offset: 0x000ce8fb
Faulting process id: 0xbd4
Faulting application start time: 0x01d28db92a6d6c1e
Faulting application path: C:\APPPATH\source\PBNFMV\bin\Debug\PBNFMV.exe
Faulting module path: C:\windows\SysWOW64\ntdll.dll
Report Id: 72f988f9-f9ac-11e6-8d91-000acd1f71fd
Exception settings completely enabled:
C++ exceptions
common language runtime exceptions
gpu memory access exceptions
managed debugging assitants
win32 exceptions
The issue is solved.
Hence: very strange.
It was due to construction of an object further (!) in code execution, which made things crash (because of a bad implementation in a library).
The strange part is why that object was already instantiated, i believe some optimalisation in the .net runtime.
Apologies
When running locally in the emulator the web worker works fine. However whenever I update my web worker running on an Azure VM I get the following exceptions exceptions in the event viewer and the role won't start:
Application: WaWorkerHost.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AggregateException
Stack:
at System.Threading.Tasks.Task.Wait(Int32, System.Threading.CancellationToken)
at System.Threading.Tasks.Task.Wait()
at Foo.PushProcess.WorkerRole.Run()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRoleInternal()
at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.b__2()
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()
Inner Exception: A task was canceled.
Faulting application name: WaWorkerHost.exe, version: 2.6.1198.712, time stamp: 0x54eba731
Faulting module name: KERNELBASE.dll, version: 6.3.9600.17415, time stamp: 0x54505737
Exception code: 0xe0434352
Fault offset: 0x0000000000008b9c
Faulting process id: 0xfb8
Faulting application start time: 0x01d11e3128981a5d
Faulting application path: E:\base\x64\WaWorkerHost.exe
Faulting module path: D:\Windows\system32\KERNELBASE.dll
Report Id: 30631c5c-8a25-11e5-80c6-000d3a22f3ec
Faulting package full name:
Faulting package-relative application ID:
Session "MA_ETWSESSION_WAD_415df88f8a0447178dbd4c18f1349f0e_Foo.PushProcess_Foo.PushProcess_IN_0" failed to start with the following error: 0xC0000035
This is the relevant code:
public override void Run()
{
Trace.TraceInformation("Foo.PushProcess is running");
try
{
RunAsync(_cancellationTokenSource.Token).Wait(); // This is where the exceptions point to
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
_runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
_storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
var queueClient = _storageAccount.CreateCloudQueueClient();
_pushQueue = queueClient.GetQueueReference("pushes");
_pushQueue.CreateIfNotExists();
CreatePushBroker();
Trace.TraceInformation("Foo.PushProcess has been started");
return result;
}
private async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
CloudQueueMessage message = null;
try
{
message = _pushQueue.GetMessage();
if (message != null)
{
ProcessItem(message);
}
}
catch (Exception ex)
{
if (message != null && message.DequeueCount > 5)
_pushQueue.DeleteMessage(message);
Trace.TraceError("[WORKER] Retrieval Failure: " + ex);
}
await Task.Delay(1000, cancellationToken);
}
}
Note some code has been omitted, however that is all run after the initialisation and in theory isn't reached by this exception.
I am completely at a loss as to what could cause this issue. Any help would be appreciated - even if only to aid me getting a helpful exception.
UPDATE
I have now reduced my code to the below - it is as simple as a web worker can possibly be - and I am still getting the exceptions. I believe that either the old worker is being cached, or there is an issue in the deployment procedure.
public override void Run()
{
Trace.TraceInformation("Foo.PushProcess is running");
try
{
RunAsync(_cancellationTokenSource.Token).Wait(); // This is where the exceptions point to
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
_runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
return result;
}
private async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
// code removed for testing - no work is being done.
await Task.Delay(1000, cancellationToken);
}
}
I gave this a whirl and wasn't able to get this to repro on my end. I have VS 2015 Enterprise (14.0.23107.0 D14REL) from a MSDN Azure image I deployed running with .Net Fx version 4.6. I have Azure Tools and SDK 2.8 installed. I created a new Azure Cloud Service using .NET Fx 4.5.2 and I add a single worker role.
I just ran some sparse code template from yours as follows:
public class WorkerRole : RoleEntryPoint
{
private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
private readonly ManualResetEvent runCompleteEvent = new ManualResetEvent(false);
private CloudQueue _pushQueue;
private CloudStorageAccount _storageAccount;
public override void Run()
{
Trace.TraceInformation("WorkerRole1 is running");
try
{
this.RunAsync(this.cancellationTokenSource.Token).Wait();
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
this.runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
_storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
var queueClient = _storageAccount.CreateCloudQueueClient();
_pushQueue = queueClient.GetQueueReference("pushes");
_pushQueue.CreateIfNotExists();
CreatePushBroker();
Trace.TraceInformation("Foo.PushProcess has been started");
return result;
}
private void CreatePushBroker()
{
return;
}
public override void OnStop()
{
Trace.TraceInformation("WorkerRole1 is stopping");
this.cancellationTokenSource.Cancel();
this.runCompleteEvent.WaitOne();
base.OnStop();
Trace.TraceInformation("WorkerRole1 has stopped");
}
private async Task RunAsync(CancellationToken cancellationToken)
{
// TODO: Replace the following with your own logic.
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
CloudQueueMessage message = null;
try
{
message = _pushQueue.GetMessage();
if (message != null)
{
ProcessItem(message);
}
}
catch (Exception ex)
{
if (message != null && message.DequeueCount > 5)
_pushQueue.DeleteMessage(message);
Trace.TraceError("[WORKER] Retrieval Failure: " + ex);
}
await Task.Delay(1000, cancellationToken);
}
}
private void ProcessItem(CloudQueueMessage message)
{
return;
}
}
}
That runs without issue in the local emulator, and I went ahead and deployed it to West US with IntelliTrace enabled, on a small instance VM, and had n deployment issues. It is running on a WA-GUEST-OS-4.26_201511-0 guest worker role image, and I was able to RDP into the machine, and I didn't see any issues related to the code or the machine. DO you have any other binaries you might not be including in your packages, or perhaps there are some dependencies not defined properly, or storage account naming issues?
Here was the deployment log for me. As you can see, it took about 7 minutes as I had it pull storage from East US just for fun:
1:11:25 AM - Warning: There are package validation warnings.
1:11:26 AM - Checking for Remote Desktop certificate...
1:11:26 AM - Uploading Certificates...
1:11:42 AM - Applying Diagnostics extension.
1:12:24 AM - Preparing deployment for AzureCloudService1 - 11/24/2015 1:11:19 AM with Subscription ID '9a4715f5-acb8-4a18-8259-1c28b92XXXXX' using Service Management URL 'https://management.core.windows.net/'...
1:12:24 AM - Connecting...
1:12:24 AM - Verifying storage account 'ericgoleastus'...
1:12:24 AM - Uploading Package...
1:12:28 AM - Creating...
1:13:15 AM - Created Deployment ID: c5f26568707b46a3bd42466dd0bf7509.
1:13:15 AM - Instance 0 of role WorkerRole1 is creating the virtual machine
1:13:15 AM - Starting...
1:13:32 AM - Initializing...
1:14:36 AM - Instance 0 of role WorkerRole1 is starting the virtual machine
1:16:11 AM - Instance 0 of role WorkerRole1 is in an unknown state
1:16:43 AM - Instance 0 of role WorkerRole1 is busy
Details: Starting role... System is initializing. [2015-11-24T01:16:08Z]
1:19:50 AM - Instance 0 of role WorkerRole1 is ready
1:19:50 AM - Created web app URL: http://quequetest.cloudapp.net/
1:19:50 AM - Complete.
Let us know if you can get some more details possibly with IntelliTrace enabled.
Regards,
Eric
To fix this issue I simply deleted the original Cloud VM instance which held the worker role, recreated it and re-published the role. From that point it has worked absolutely fine.
I am still unable to determine what caused the error, and have had no further issues like this with any other worker role. My assumption here was that there was a configuration issue with the VM which could not be amended through code or the Azure portal.
My service code resided in OnStart() throws Exception(I) and service is stopped. I don't know why is there any ex. thrown?.. This is my code:
public Service1()
{
InitializeComponent();
}
Thread thread;
protected override void OnStart(string[] args)
{
thread = new Thread(delegate()
{
string path = #"D:\levani\FolderListenerTest\ListenedFolder";
FileSystemWatcher listener;
listener = new FileSystemWatcher(path);
listener.Created += new FileSystemEventHandler(listener_Created);
listener.EnableRaisingEvents = true;
});
thread.Start();
}
public void listener_Created(object sender, FileSystemEventArgs e)
{
File.Copy(e.FullPath, #"D:\levani\FolderListenerTest\CopiedFilesFolder\F" + e.Name);
}
protected override void OnStop()
{
thread.Abort();
}
Log
Log Name: Application
Source: .NET Runtime
Date: 6/11/2012 5:33:27 PM
Event ID: 1026
Task Category: None
Level: Error
Keywords: Classic
User: N/A
Computer: Levan-PC
Description:
Application: FolderListenerService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.IOException
Stack:
at System.IO.__Error.WinIOError(Int32, System.String)
at System.IO.File.InternalCopy(System.String, System.String, Boolean)
at System.IO.File.Copy(System.String, System.String)
at FolderListenerService.Service1.listener_Created(System.Object, System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32, System.String)
at System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name=".NET Runtime" />
<EventID Qualifiers="0">1026</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2012-06-11T14:33:27.000000000Z" />
<EventRecordID>18314</EventRecordID>
<Channel>Application</Channel>
<Computer>Levan-PC</Computer>
<Security />
</System>
<EventData>
<Data>Application: FolderListenerService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.IOException
Stack:
at System.IO.__Error.WinIOError(Int32, System.String)
at System.IO.File.InternalCopy(System.String, System.String, Boolean)
at System.IO.File.Copy(System.String, System.String)
at FolderListenerService.Service1.listener_Created(System.Object, System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs)
at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32, System.String)
at System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
</Data>
</EventData>
</Event>
It could be any number of reasons. See File.Copy() documentation, especially the Exceptions section that document all the exceptions that could be thrown.
You need to wrap your File.Copy() and catch any exceptions so you can react appropriately:
public void listener_Created(object sender, FileSystemEventArgs e)
{
try
{
File.Copy(e.FullPath, #"D:\levani\FolderListenerTest\CopiedFilesFolder\F" + e.Name);
}
catch {FileNotFoundException e)
{
//do something if file isn't there
}
catch {UnauthorizedAccessException e)
{
//do something if invalid permissions
}
//etc
}
Extra parameter true in File.Copy will overwrite the file if already exists. I think the error is of file already exist.
File.Copy(e.FullPath, #"D:\levani\FolderListenerTest\CopiedFilesFolder\F" + e.Name,true);
Put the code in try..catch block and catch the IOException exception. You can do logging in file for further debugging.
We get the WinIOError error (as we get in call stack) when The filename , directory name, or volume label syntax is incorrect. So just check for the correct path and filename.
I don't know why but after I surrounded my code by try {} catch {} it works excellent, Have any idea? This is code:
public Service1()
{
InitializeComponent();
}
Thread thread;
protected override void OnStart(string[] args)
{
try
{
thread = new Thread(delegate()
{
string path = #"D:\levani\FolderListenerTest\ListenedFolder";
FileSystemWatcher listener; listener = new FileSystemWatcher(path);
listener.Created += new FileSystemEventHandler(listener_Created);
listener.EnableRaisingEvents = true;
});
thread.Start();
}
catch (Exception ex)
{
File.WriteAllText(#"D:\levani\bussite.txt", "thread: " + ex.ToString());
}
}
public void listener_Created(object sender, FileSystemEventArgs e)
{
try
{
File.Copy(e.FullPath, #"D:\levani\FolderListenerTest\CopiedFilesFolder\F" + e.Name);
}
catch (Exception ex)
{
File.WriteAllText(#"D:\levani\bussite.txt", "File copy ex: " + ex.ToString());
}
}
protected override void OnStop()
{
thread.Abort();
}
If you create a new thread, you need to be sure to handle all exceptions thrown on that thread. Any unhandled exceptions that occur on a thread created by Thread.Start() will cause your application to terminate.
Specifically, the constructor FileSystemWatcher(string path) and File.Copy(string sourceFileName, string destFileName) throw several exceptions that you are not handling in your current code. Both of these are being called on a separate thread. It is most likely that you are getting an IOException, due to the file already existing (multiple changes to the same file will cause your code to try to copy it more than once, causing a collision on any copies after the first).
You should probably update your File.Copy call to use File.Copy(string sourceFileName, string destFileName, bool overwrite) and wrap your listener_Created function in a try/catch block that does soemthing with the exception (other than rethrowing it).