I am trying to return a list of selected feature attribute field, "mukey" from a feature class, "MUPOLYGON". I tried to look-up the mukey using the GetTable() method and creating a mukey list. However, I am getting an error that says cannot convert a Task to a string parameter when I tried to use the mukey list as a parameter for another method. I have the following questions:
1. What is a light weight method to obtain a mukey list from the selected feature field, mukey?
2. How do I resolve the conversion error?
public async Task LookupMukey()
{
var mukeys = new List<string>();
var MV = MapView.Active;
int mukeyCount = 0;
var SelectionLayer = MV.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(fl => fl.Name.Contains("SelectionLayer")).FirstOrDefault();
await QueuedTask.Run(() =>
{
using (var SelectionTable = SelectionLayer.GetTable())
{
using (var rowCursor = SelectionTable.Search())
{
while (rowCursor.MoveNext())
{
using (Row row = rowCursor.Current)
{
var mukey = Convert.ToString(row["mukey"]);
mukeys.Add(mukey);
mukeyCount++;
}
}
}
}
return mukeys;
});
}
Using the mukey list as a parameter for another method:
Process.ChorizonData(mukeys,"awc_l", "awc_r", "awc_h", inputPath); //error occurs here at mukey
Thanks for your help!
Hi,
Your function must be like this :
public async Task<List<string>> LookupMukey()
{
var mukeys = new List<string>();
var MV = MapView.Active;
int mukeyCount = 0;
var SelectionLayer = MV.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(fl => fl.Name.Contains("SelectionLayer")).FirstOrDefault();
await QueuedTask.Run(() =>
{
using (var SelectionTable = SelectionLayer.GetTable())
{
using (var rowCursor = SelectionTable.Search())
{
while (rowCursor.MoveNext())
{
using (Row row = rowCursor.Current)
{
var mukey = Convert.ToString(row["mukey"]);
mukeys.Add(mukey);
mukeyCount++;
}
}
}
}
});
return mukeys;
}
And call to function:
var mukeys = await LookupMukey();
Thanks for your help Gintautas! When I tried to call the function, I am getting an error that says, "CS4034: The await operator can only be used with an async lambda expression. Consider marking this lambda expression with the async modifier." Where do I add the async modifier to the lambda expression?
Is this right? await QueuedTask.Run(async() =>... //error: lack await operator
You can add "async" to "var mukeys = await LookupMukey();" calling method like this:
public async voif Your_Method()
{
var mukeys = await LookupMukey();
}
or change LookupMukey method calling to:
var mukeys = LookupMukey().Result;
Hi Gintautas,
What if I am calling the LookupMukey method in a ICommand event handler? How should I call the LookupMukey()? Please see the example below:
//within a public ICommand CmdRun binded to a Run button
AllProcesses Process = new AllProcesses();
var mukeys = await Process.LookupMukey(); //error occurs here
//codes below - calling multiple methods and passing the list of mukeys as one of the parameters
Thanks for your help!
Hi,
If I understand right, it must be like this:
protected XViewModel()
{
_CommandX = new RelayCommand(() => CmdX(), true);
}
private ICommand _CommandX;
public ICommand CommandX
{
get { return _CommandX; }
}
/// <summary>
/// Execute the X command
/// </summary>
private async void CmdX()
{
AllProcesses Process = new AllProcesses();
var mukeys = await Process.LookupMukey();
//codes below - calling multiple methods and passing the list of mukeys as one of the parameters
}
// or
private void CmdX()
{
AllProcesses Process = new AllProcesses();
var mukeys = Process.LookupMukey().Result;
//codes below - calling multiple methods and passing the list of mukeys as one of the parameters
}