|
Since I can't see your code or debug it, I can only offer tips.
1. Objects that are instanced and shared are not thread safe. Static code is thread safe. If multiple threads are going to access the same code base, then make that shared "code base" static, if possible.
2. I don't use BGW anymore, if I can help it. I use the Task Parallel Library (TPL -- Google search it). This has saved me from insanity, multiple times.
Is this a possible scenario to use Ansyc programming here?
|
|
|
|
|
Why don't you just use one of the thread-safe collections from the System.Collections.Concurrent namespace?
You also need to be more clear about what you mean by "updating" ... This has some influence on the type of collection best suited.
|
|
|
|
|
The closest to an ObservableCollection I could find was ConcurrentBag, but it doesn't seem to meet all my needs. By 'updating' I simply mean I'm adding items to it on a background thread. Ultimately, I found there is no issue changing the properties of items contained in the collection while items are being added with the current setup; however, the application crashes regardless if items are being added to it when a property in my view model changes, which I don't think has anything to do with threading now.
I'm going to implement my own thread-safe ObservableCollection class just to be safe and go from there. Thanks to everyone who responded!
|
|
|
|
|
You're still not clear: you say you are "simply adding"; then you say you are "changing the properties of the items".
You have said nothing that indicates a "custom" collection.
|
|
|
|
|
Hi All!
thanks to help say, what's the best book about "c# network programming"
Thanks
modified 13-Jul-16 13:25pm.
|
|
|
|
|
|
The problem was in the unmanaged DLL. But I really learnt a great deal about other topics such as BackgroundWorkers and TPL. Thanks all.
=======================
Hello There. I have this small DLL that takes input_name and output_name as parameters. It opens the input file, reads it and produces output file with the specified name after some processing.
I then call this function from C#. First time I call it, it runs fine. But second time around, it throws this exception
<br />
An unhandled exception of System.AccessViolationException occured in CSharpProgram.exe.<br />
Attempted to read or write protected memory.<br />
Here is what I am trying.
[DllImport("MyDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int Call_Dll_Main(string input, string output);
private void Button_Click(object sender, EventArgs ea)
{
new System.Threading.Thread(new System.Threading.ThreadStart(Call_Dll_Function)).Start()
}
private void Call_Dll_Function()
{
int nResult = Call_Dll_Main(txtInputFile.Text.Trim(), txtOutputFile.Text.Trim());
}
What could be wrong? What am I missing here? Thanks for any input.
modified 14-Jul-16 11:34am.
|
|
|
|
|
Well, the first thing I would do is put those TextBox values you trim into variables before you pass them to the .DLL. The GC will collect those values since they don't have any managed variables or pins holding onto references to them so the GC may be collecting them before your DLL code is finished with them.
Next, it would appear that you're completely ignoring the return code from the C function. I t has nothing to do with the error, but it's something to watch out for.
Any other problems would be in the C code itself, which you didn't show for this function.
|
|
|
|
|
Hi,
I'm assuming you are using WinForms and those textXXXFile objects are Controls, maybe TextBoxes. A Control should only be created and used by a single thread, most often that would be the main or "GUI thread"; violating this rule is bound to give you AccessViolation trouble.
I would recommend you use one (or more if you think you must) BackgroundWorker objects ibstead of bare Threads. A BGW will execute most of its task on a separate thread (which it borrows from the ThreadPool), however it also offers progress and completion events which execute on the main thread (assuming you created the BGW on the main thread) so all AccessViolations would disappear.
If you're unfamiliar with the BGW class, read up on it, I'm pretty sure CP has some fine articles about it.
Note 1: you should get the inputfile before entering the DoWork event.
Note 2: you could reuse the BGW object, or create a new one, that is up to you.
Note 3: there are some BGW properties you have to set true explicitly for it to activate all its goodies!
good luck
|
|
|
|
|
Accessing a control from a different thread results in an InvalidOperationException , e.g.
Quote: Cross-thread operation not valid: Control 'button1' accessed from a thread other than the thread it was created on.
|
|
|
|
|
pass the textbox values as parameters to Call_Dll_Function(). Remember that your thread can't access the controls from the UI thread - can't cross the streams.
I personally would use the Task Parallel Library (TPL) for this. There are articles on this here at Codeproject. Check it out (Sacha Barber has some good ones). I use TPL often.
Task Parallel Library: 1 of n[^]
private void Call_Dll_Function(string input, string output)
modified 13-Jul-16 15:14pm.
|
|
|
|
|
Such Access Violation Exceptions often mean that a pointer pointed to some location which is outside of the process space of your program. And such things are more likely to happen in unmanaged code, i.e. the C dll.
As we do not see the code of that dll, we can only speculate. It could be possible that the code tries to do something at the memory location of the strings it was passed at the first call, but Garbage Collection has removed them meanwhile.
|
|
|
|
|
Hello
May I consult you how did u solved this problem?
I have the similar problem
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate bool _B_B(byte O1, byte O2, byte O3, byte O4, byte O5);
private IntPtr hMod;
private _B_B funA;
if (chk = (hMod = LoadLibrary("my.dll")) != IntPtr.Zero)
if (chk = (pFunc = GetProcAddress(hMod, "funA")) != IntPtr.Zero)
funA = (_B_B)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(_B_B));
private void button_Click(object sender, EventArgs e)
{
bool chk = false;
byte temp1 = 1, temp2 = 0, temp3 = 15, temp4 = 45, temp5 = 90;
try
{
if (!(chk = funA(temp1, temp2, temp3, temp4, temp5)))
MessageBox.Show("set fail!");
}
catch (Exception ex)
{
MessageBox.Show("fail!");
}
}
|
|
|
|
|
My friend I don't remember what the issue was, but it was certainly in C++ dll. And that is what I updated the original post/question.
Please double check C++ dll. Checkout this video tutorial
|
|
|
|
|
Hi Django_Untaken
did you solve this problem? I have the same problem.
Thank in advance
|
|
|
|
|
While deleting Images m getting following Error
the action cannot be completed because the file is open in w3wp.exe,can any one get me out this problem.
if (File.Exists(_sampleImgsPath))
{
File.Delete(_sampleImgsPath);
}
|
|
|
|
|
Close the file before you try to delete it.
The message is pretty explicit: it even tells you which process is holding the file open. So, if that is your app, then start looking through your code to find out where you open it, but don't close it again. We can't do that for you - we don't have access to your code!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
As OG says, this is because the file needs to be closed first. I suspect you've got the image opened directly in your website; w3wp.exe refers to the IIS worker process that hosts your web page.
This space for rent
|
|
|
|
|
The most common cause of this is that you have created the image yourself using an Image or Bitmap class, saved the image but not disposed the Image or Bitmap class;
myImg.Save(path);
myImg.Dispose(); // <-- need this
|
|
|
|
|
Actually am going to delete the uploaded images. I have not used any Image or Bitmap, using HttpPostedFile class to upload images.
HttpPostedFile htp = (HttpPostedFile)dt.Rows[i]["postedfile"];
destination = Server.MapPath("~/ClientImages" + "\\Normal\\" + username + "\\" + date);
if (!System.IO.Directory.Exists(destination))
{
System.IO.Directory.CreateDirectory(destination);
}
htp.SaveAs(destination + "\\" + filename);
htp.InputStream.Close();
htp.InputStream.Dispose();
If i want to delete those images then am getting error.
|
|
|
|
|
I have a WPF app that gets data from a hardware device.
When the data comes in it is converted to a DataModel, then an event is raised called DataReceived. The View Model base class is subscribed to this event.
What I would like to do is have the event subscription in the base view model as an abstract class, but only have the correct implementation in the subclasses actually receive it.
See this[^]
Is this possible?
If it's not broken, fix it until it is
|
|
|
|
|
why not implement a filter event method then?
class BaseModel
{
internal virtual void OnReceive(EventModel ev)
{
if (HandleEvent(ev))
OnHandle(ev);
}
public virtual bool HandleEvent(EventModel ev) { return true;}
protected virtual void OnHandle(EventModel model) { }
}
You can even make the HandleEvent() method automatic using some generic constraint, if you so desire...
|
|
|
|
|
So it would be up to each subclass to determine if the event was handled?
If it's not broken, fix it until it is
|
|
|
|
|
|
Ok, so I modified your approach just a bit:
public abstract class BaseViewModel
{
public ViewTypes ViewType { get; protected set; }
public BaseViewModel()
{
ViewType = ViewTypes.None;
AppCore.DataReceived += AppCore_DataReceived;
}
public void AppCore_DataReceived(object sender, DataReceivedArgs args)
{
if (CanHandleDataReceived(args))
{
DataReceived(args);
}
}
protected virtual bool CanHandleDataReceived(DataReceivedArgs args)
{
return ViewType == args.ViewType;
}
protected abstract void DataReceived(DataReceivedArgs args);
}
The subclasses now only need to set the ViewType property. Then this code checks for the type and if it matches, calls the abstract DataReceived.
What do ya think?
If it's not broken, fix it until it is
|
|
|
|