I want the layouts of some of my RadControls to be persisted in background via a new Thread/Task. The corresponding method is invoked so I can access the control that should be persisted without any error. But I'm always getting an exception at the time I call PersistenceManager.Save(control). Here's my code:
Can you please provide help why PersistenceManager.Save method is always throwing an exception here? How to use PersistenceManager to save a layout in background/new Task?
// --- Part of CustomRadGradView.cs (inherits from RadGridView) ---
// Save this RadGridViews layout in background
Task.Run(() =>
{
using
(var manager =
new
CustomPersistenceManager())
{
// this is current RadGridView
manager.SaveLayout(
this
, file);
}
}
}
// --- Part of CustomPersistenceManager.cs (inherits from PersistenceManager) ---
// save layout of any Telerik control
public
bool
SaveLayout(Control control,
string
file =
null
)
{
// Current thread has no access to control -> Invoke required
if
(control.Dispatcher.CheckAccess() ==
false
)
{
bool
result =
false
;
Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,
new
Action(() => result = DoSaveLayout(control, file)));
return
result;
}
// Current thread has access to control
return
DoSaveLayout(control, file);
}
// save layout to stream
private
bool
DoSaveLayout(Control control,
string
file =
null
)
{
// this lines work without any errors so method is invoked correctly; thread has access to control!
string
name = control.Name;
// returns name of control
control.Name =
"New name"
;
// just for testing
// Next line always throws an InvalidOperationException
using
(var stream = Save(control))
// call save method of Teleriks PersistenceManager class
{
stream.Seek(0, SeekOrigin.Begin);
using
(var reader =
new
StreamReader(stream))
{
string
text = reader.ReadToEnd();
File.WriteAllText(path, text);
}
}
}
Can you please provide help why PersistenceManager.Save method is always throwing an exception here? How to use PersistenceManager to save a layout in background/new Task?