goo*_*ate 1 c# performance wcf delegates closures
假设我有以下WCF代码:
try
{
ServiceClient proxy = new ServiceClient();
proxy.ClientCredentials.UserName.UserName = "user";
proxy.ClientCredentials.UserName.Password = "password";
proxy.GetData(2);
if (proxy.State = CommunicationState.Opened)
{
proxy.GetData("data");
}
proxy.Close();
}
catch (FaultException ex)
{
// handle the exception
}
Run Code Online (Sandbox Code Playgroud)
而且因为我注意到try ... catch和其他逻辑是重复的,更不用说设置WCF调用是昂贵的,我想向这个函数发送许多"方法和参数".
本质上是传递GetData(2)
和GetData("data")
作为方法数组,并使结果异步或同步返回.
我怎么做到这一点?
我想我可以有两个'ref'对象来处理结果[]和对结果[]的共享锁.但是我不确定如何将"带参数的方法"作为参数传递给另一个函数.
也许另一种看待它的方法可能是一个函数指针数组,使用不同的参数来表示相同的函数.
任何人都可以推动我做正确的方法吗?
更多信息:
我问这个问题所以我可以优化这种方法来处理WCF异常和重试,但所以我不必总是在每次调用后打开/关闭客户端.
使用委托并在列表中传递它们.
Func<T>
需要返回值时使用C#委托.
List<Func<Data>> funcList = new List<Func<Data>>();
funcList.Add( () => GetData(2) );
// You can use any condition as you otherwise would to add to the list.
if (proxy.State = CommunicationState.Opened)
{
funcList.Add( () => GetData("data") );
}
List<Data> ProcessFuncs(List<Func<Data>> funcDatas)
{
List<Data> returnList = new List<Data>();
foreach(var func in funcDatas)
{
returnList.Add(func());
}
}
Run Code Online (Sandbox Code Playgroud)
(只要返回类型相同,这将有效)
这只是一个例子; 如果你的方法没有返回任何东西,你可以使用C#Action
委托,它只执行一个动作而不返回任何值.
List<Action> actionList = new List<Action>();
actionList.Add( () => ProcessData("data")); // ProcessData is a void with no return type
actionList.Add( () => ProcessData(2));
public void ProcessActions(List<Action> actions)
{
foreach(var action in actions)
{
action();
}
}
Run Code Online (Sandbox Code Playgroud)
回应一些评论:
此代码编译并完全等效:
class Program
{
public static string GetData(string item) { return item; }
public static string GetData(int item) { return item.ToString(); }
static void Main(string[] args)
{
string someLocalVar = "what is it?";
int someLocalValueType = 3;
Func<string> test = () =>
{
return GetData(someLocalVar);
};
Func<string> test2 = () => GetData(someLocalValueType);
someLocalValueType = 5;
List<Func<string>> testList = new List<Func<string>>();
testList.Add(() => GetData(someLocalVar));
testList.Add(() => GetData(2));
testList.Add(test);
testList.Add(test2);
someLocalVar = "something else";
foreach(var func in testList)
{
Console.WriteLine(func());
}
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
归档时间: |
|
查看次数: |
982 次 |
最近记录: |