|
Thanks for PRE tags.
I'm replying here as this allows me to still see your code while I type.
IMO the problem is this: AppNameService contains one big loop (do ... while bolContinue), which contains some conditional tests. In one path a blocking method (WaitForExit) is called; in all other execution paths (when bolCompareValue is false or when bolFilesToProcess is false), the code never becomes idle, hence uses all available cycles to hurry up and start the next loop iteration.
There are a couple of ways to fix this:
1. the easy one: when nothing needs to be done in an iteration, call Thread.Sleep(100) to relinquisg the CPU for 100 msec, or whatever number that looks fine, but not below 10, as that is about equal to the system's tick resolution (see my Timers article).
2. the more economical one: if possible, make everything event-driven, i.e. don't poll (=check for certain conditions) at all, just tell the party responsible for those conditions to send you a signal. This isn't always possible.
Some additional comments:
1. there is no need to write if (booleanFlag==true) ... , a simple if (booleanFlag) ... behaves identically in C#.
2. in your try block, you are logging the Exception.Message but ignoring all the extra information that may be present in the Exception, and only gets visible by looking at its remaining properties (or easier: by looking at Exception.ToString(); I recommend keeping a log file with all the ToString() results, assuming they would be too much to put into the existing eventLog)
3. I don't like explicit GC.Collect() calls; maybe it is OK or even good in a service, I would certainly ban them from interactive programs.
|
|
|
|
|
Thank you very much for the advice and quick response. I will apply your service suggestion on Monday when I return to work and then reply back with the method that worked. Also thank you for the general C# coding recommendations.
|
|
|
|
|
Option 1 (Thread.Sleep(100);) worked beutifully as Luc Pattyn suggested. Thank you!
}
}
Thread.Sleep(100);
}
catch (Exception ex)
{
bolContinueService = false;
sErrorMessage = "Error in DocumentShuttle Service " + sAssemblyVersion + " Continuous process Loop. Error: " + ex.Message;
sRetStatusErrorLog = WriteInLog(sErrorMessage);
eventLog1.WriteEntry(sErrorMessage, EventLogEntryType.Error);
}
|
|
|
|
|
Anyone knows how to handle the code in chapter 26 from the book "Microsoft Visual C# Step by Step"? This example runs well except for adding a row to the listview control that is biding with the Northwind database, I tryed everything but it seems the problem is the data binding and the listview control that doesn't recognize the format of the table problably because the table is joined with another table and the listview control refers to only one table. I will post the code that gives a the runtime error later.
|
|
|
|
|
i used this code to play a video on a panel control
using Microsoft.DirectX.AudioVideoPlayback;
private void open(string path)
{
try
{
myvideo = new Video(path);
myvideo.Owner =panel1;
myvideo.Play();
}
catch
{
}
}
but when i run the program it keeps saying
"Loader Lock was detected:
DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' is attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang."
if i press the run button again it continues excuting normally. What's wrong with the code and how do i fix it???
modified on Friday, December 11, 2009 2:14 PM
|
|
|
|
|
I Could be bug, Please try to update DirectX to newest. I Know that Microsft didn't update Managed Direct X for quite a while. You coud look at the alternative:
slimDX[^]
|
|
|
|
|
Hello
I would like to know difference betwen casting and if there is one, then in which conditions shroud be used
Example:
TextBox txt = new TextBox;
Object obj = txt;
// What is the difference between these 2 castings
TextBox txt1 = (TextBox) txt;
TextBox txt2 = txt as TextBox;
This may be stupid question but thanks in advance
|
|
|
|
|
|
And in general, I prefer using 'as', but it depends on your situation. If you want an exception to be thrown, use explicit casting (ex. "((TextBox)obj) "). Generally, its good to avoid exceptions unless there's just nothing you can do to avoid the 'exceptional' behavior.
|
|
|
|
|
Thanks to both replies. Those answer extinguish my curiosty
|
|
|
|
|
Also, the C-style cast can be overloaded, but as can not be overloaded.
|
|
|
|
|
I've created a control to embed a MSWord document based on several projects here. The embeding it's self works great but I am having trouble figuring out how to bind event handlers. See below for an example.
Word.DocumentBeforeClose += new ApplicationEvents4_DocumentBeforeCloseEventHandler(OnClose);
The above line works with doing early binding, but due to the variations in version of Office being used in the company, I need to do late binding. Anyone got any ideas?
Thank you,
Eric Ritzie
|
|
|
|
|
I Don't think you can do it that way. There are 2 options that I thought:
1. Option:
Install same version of Office
2. Option:
Use different module (dll) based on Office installed
3. Option: (I Don't know how to do it in C#
Use compiler directive and compile different exe files
|
|
|
|
|
Hmmm.....Option 1 is not really feesable because of cost. Options 2 and 3 would be a big pain although they are doable.
I think there has to be a way to do what I am trying to accompish biw the Interop. I'm able to get and set properties by using type.InvokeMember() and I can even get an event object by using type.GetEvent(), I just need that last little bit to bind it to my event handlers.
Thank you,
Eric Ritzie
|
|
|
|
|
I am at a lost. I have verified what I am doing against the documentation on microsofts website:
http://msdn.microsoft.com/en-us/library/aa392154(VS.85).aspx[^] and I just can't figure out why it would give me this error.
My Connection object is not shown as it is global within the class I have it in. I am connect to this machine that is not on the domain and get installed applications, all services, and computer information. The problem is it keeps throwing a "Invalid Method Parameter(s)" error.
In case your wondering.. I ran a foreach look on the inParams.Properties and verified that all the method parameters existed in the inParams (which it does).
Any help would be great!
public string Join(string dns, string domain, string username, string password)
{
try
{
ManagementScope scope = new ManagementScope(@"\\" + dns + @"\root\CIMV2", conn);
ManagementPath path = new ManagementPath("Win32_ComputerSystem");
ManagementClass mgmtClass = new ManagementClass(scope, path, null);
ManagementBaseObject inParams = mgmtClass.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["Name"] = domain;
inParams["UserName"] = username;
inParams["Password"] = password;
inParams["AccountOU"] = null;
inParams["FJoinOptions"] = (UInt32)1;
ManagementBaseObject outParams = mgmtClass.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
string status = ReturnedValue.JoinDomainOrWorkgroup(Convert.ToInt32(outParams["ReturnValue"]));
return status;
}
catch (Exception ex)
{
EventLog.WriteEntry("ADEM Application", ex.Message, EventLogEntryType.Error);
return ex.Message;
}
}
|
|
|
|
|
Hi Jacob,
I'm not familiar with the specifics of your query, however I strongly advice everyone to always look at Exception.ToString() as it often contains much more than a Message and a TraceBack; there may be additional information, and one or more inner exceptions.
|
|
|
|
|
Good idea.. but I didn't really find anything worth while that I can see. I even set break points and can't seem to find out why it is doing this.. WMI is a pain sometimes
System.Management.ManagementException: Invalid method Parameter(s)
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObject.InvokeMethod(String methodName, ManagementBaseObject inParameters, InvokeMethodOptions options)
at WMI.WMI_Commands.Join(String dns, String domain, String username, String password) in C:\Users\jdixon\Documents\Visual Studio 2008\Projects\DLL\WMI\frmWMI.cs:line 92
|
|
|
|
|
As you have posted that link, I presume you are using PInvoke of JoinDomainOrWorkgroup
I saw that it expects to pass 5 parameters (According to MSDN) and you are using only one
|
|
|
|
|
I am passing 4 parameters:
inParams["Name"] = domain;
inParams["UserName"] = username;
inParams["Password"] = password;
inParams["AccountOU"] = null;
inParams["FJoinOptions"] = (UInt32)1;
I am actually specifying 5 but the AccountOU one is optional. This is using WMI
|
|
|
|
|
Your Code:
ManagementBaseObject outParams = mgmtClass.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
string status = ReturnedValue.JoinDomainOrWorkgroup(Convert.ToInt32(outParams["ReturnValue"]));
At witch line it does fail?
Also how do you use define how do you use that delegate?
|
|
|
|
|
Fails:
ManagementBaseObject outParams = mgmtClass.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
|
|
|
|
|
try
{
ManagementObject classInstance =
new ManagementObject("root\\CIMV2",
"Win32_ComputerSystem.Name='BSAKSIDA-PC'",
null);
ManagementBaseObject inParams =
classInstance.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["AccountOU"] = " OU=testOU, DC=domain, DC=Domain, DC=com";
inParams["Name"] = "WORKGROUP";
inParams["Password"] = null;
inParams["Username"] = "everyone";
ManagementBaseObject outParams =
classInstance.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
Console.WriteLine("Out parameters:");
Console.WriteLine("ReturnValue: " + outParams["ReturnValue"]);
}
catch(ManagementException err)
{
MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message);
}
I Used this example to get it working on mine side. I do not know how to do it in your case, because i only have Workgroup not domain
WMI Code Creator[^]
I Used that tool (Can run C# code as script) to create that WMI call. I do not know why it fail, bat play with that tool.
Tip: Look at »Execute a Method«, under menu select apropriate target. Method [in] Parameters are buggy, so write manualy inside generated code on left. You can directly execute the code without Visual Studio
|
|
|
|
|
I am using the WMI Code Creator also.
I modified what you supplied a little and still have no luck.
try
{
ManagementObject classInstance = new ManagementObject("\\WIN-HSPKIXZR3HK\\root\\CIMV2", "Win32_ComputerSystem", null);
ManagementBaseObject inParams = classInstance.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["AccountOU"] = " OU=Computers, DC=adem, DC=arkansas, DC=gov";
inParams["Name"] = "WORKGROUP";
inParams["Password"] = null;
inParams["Username"] = "everyone";
ManagementBaseObject outParams = classInstance.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
Console.WriteLine(outParams["ReturnValue"]);
}
catch (ManagementException err)
{
Console.WriteLine(err.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
ERROR:
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.4927
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
System.ArgumentOutOfRangeException: Specified argument was out of the range of v
alid values.
Parameter name: path
at System.Management.ManagementObject.ManagementObjectCTOR(ManagementScope sc
ope, ManagementPath path, ObjectGetOptions options)
at System.Management.ManagementObject..ctor(String scopeString, String pathSt
ring, ObjectGetOptions options)
at WMISample.CallWMIMethod.Main()
C:\Windows\Microsoft.NET\Framework\v2.0.50727>
I also tried this way which is more like what you supplied:
try
{
ManagementObject classInstance = new ManagementObject("\\root\\CIMV2", "Win32_ComputerSystem.Name='WIN-HSPKIXZR3HK'", null);
ManagementBaseObject inParams = classInstance.GetMethodParameters("JoinDomainOrWorkgroup");
inParams["AccountOU"] = " OU=Computers, DC=adem, DC=arkansas, DC=gov";
inParams["Name"] = "WORKGROUP";
inParams["Password"] = null;
inParams["Username"] = "everyone";
ManagementBaseObject outParams = classInstance.InvokeMethod("JoinDomainOrWorkgroup", inParams, null);
Console.WriteLine(outParams["ReturnValue"]);
}
catch (ManagementException err)
{
Console.WriteLine(err.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
With ERROR:
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.4927
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
System.Management.ManagementException: Not found
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStat
us errorCode)
at System.Management.ManagementObject.Initialize(Boolean getObject)
at System.Management.ManagementBaseObject.get_wbemObject()
at System.Management.ManagementObject.get_ClassPath()
at System.Management.ManagementObject.GetMethodParameters(String methodName,
ManagementBaseObject& inParameters, IWbemClassObjectFreeThreaded& inParametersCl
ass, IWbemClassObjectFreeThreaded& outParametersClass)
at System.Management.ManagementObject.GetMethodParameters(String methodName)
at WMISample.CallWMIMethod.Main()
C:\Windows\Microsoft.NET\Framework\v2.0.50727>
|
|
|
|
|
I Have tried both example. I do not know why it fails, but the second fails because WIN-HSPKIXZR3HK is incorectly. The example I provided connects to LocalHost (Same Computer). It is very hard to help if you want to connect to Domain, because I can not test it. (Probably i wolould Need dedicated machine with Windows 2003 server or 2008 server). Have you tried to put IP for destenation computer?
|
|
|
|
|
I understand. I think it is something wrong with the code provided by microsoft. I have googled this with no luck of anyone doing it with a remote computer. Technically it should work. Using code like I have provided, I am able to install software, uninstall software, get list of services, get list of disk drives with amount of space, free space, etc... and even model and vendor information about the computer.
The fact that the error it gives me is "Invalid Method Parameters" tells me that the code on MSDN is fishy. It doesn't say it can't work for a remote computer...
I don't know..
Let me ask you this, do you know if there is any way to accomplish this with PInvoke? I know there is this: http://www.pinvoke.net/default.aspx/netapi32/NetJoinDomain.html[^] but that seems only able to join the local computer to the domain. Not a remote computer
|
|
|
|